2012-05-09 54 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來代替合併標記。