2012-05-09 55 views
3

你好我想在这里<merge>标签夸大我的布局是我的main.xml:充气,合并

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <com.osmgames.kartuves.LinesLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/lines" /> 

</merge> 

这是我LinesLayout.java:

public class LinesLayout extends FrameLayout { 

    public LinesLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     super.onLayout(changed, l, t, r, b); 
    } 
    @Override 
    public boolean onInterceptTouchEvent(MotionEvent event) { 
     super.onInterceptTouchEvent(event); 
     return false; 
    } 
} 

我的主。 java:

public class main extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    }} 

所以我想膨胀下面的XML到main.xml。我怎样才能做到这一点?

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent"> 

    <ImageView 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_gravity="center" 
     android:layout_marginTop="75dp" 
     android:layout_marginRight="40dp" 
     android:src="@drawable/line" /> 

    <ImageView 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_gravity="center" 
     android:layout_marginTop="75dp" 
     android:src="@drawable/line" /> 

    <ImageView 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_gravity="center" 
     android:layout_marginTop="75dp" 
     android:layout_marginLeft="40dp" 
     android:src="@drawable/line" /> 
</FrameLayout> 

这是记录我越来越:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.osmgames.kartuves/com.osmgames.kartuves.InGame}: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 

Caused by: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true 
at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
at **com.osmgames.kartuves.InGame.onCreate(InGame.java:59)** 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
... 11 more 

InGame.java:59是:

58 FrameLayout item = (FrameLayout)findViewById(R.id.lines); 
59 View child = getLayoutInflater().inflate(R.layout.letters3, null); 
60 item.addView(child); 

回答

2

合并标签应在充气布局中使用,它本身合并在父ViewGroup中。

试试这个:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent"> 

    <com.osmgames.kartuves.LinesLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/lines" /> 

</FrameLayout > 

这:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ImageView 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_gravity="center" 
     android:layout_marginTop="75dp" 
     android:layout_marginRight="40dp" 
     android:src="@drawable/line" /> 

    <ImageView 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_gravity="center" 
     android:layout_marginTop="75dp" 
     android:src="@drawable/line" /> 

    <ImageView 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_gravity="center" 
     android:layout_marginTop="75dp" 
     android:layout_marginLeft="40dp" 
     android:src="@drawable/line" /> 
</merge> 

希望这将有助于

+0

否; /仍然相同;/ –

+0

对不起,忘了一件事: 您的合并视图需要有一个视图组作为合并视图。 您也可以使用include标签,可以更好地满足您的需求。 –

+0

我试过包括,但我需要根据应用程序的需要以编程方式设置包含的布局。我需要设置应该插入的8个布局中的一个... –

2

使用

View headerView = View.inflate(this, R.layout.layout_name, null); 
    lv.addHeaderView(headerView); 

膨胀你的布局,它会给你你的父母布局在哪里h所有视图都存在,然后进行类型转换,或者如果要添加,则直接将其添加到另一个布局。

+0

也许你必须在最后一个参数中输入true,如果你还想连接组件的话。 – PhoneixS

+0

如果你添加更多关于你为什么要这样做的解释,这可能会很好。 – PhoneixS

0

你应该更好地利用

58 FrameLayout item = (FrameLayout)findViewById(R.id.lines); 
59 View child = getLayoutInflater().inflate(R.layout.letters3, item, false); 
60 item.addView(child); 

或 可以使用

58 FrameLayout item = (FrameLayout)findViewById(R.id.lines); 
    59 View child = getLayoutInflater().inflate(R.layout.letters3, item, true); 

当你传递true它会自动做的事情你。

这将是一个更少的视图,而不是你正在添加的无用的FrameLayout来代替合并标记。