2012-12-26 54 views
10

我有一個CustomView類,我想爲它使用xml佈局。所以,我的課程延伸RelativeLayout,膨脹XML佈局,並嘗試將其附加到自我。Android xml合併版式錯誤膨脹

public class CustomView extends RelativeLayout 
{ 
    public CustomView (Context context) 
    { 
    super(context); 
    LayoutInflater.from(context).inflate(R.layout.layers_list_item, this, true); 
    } 
} 

如果我的XML佈局有一定的佈局(線性,例如)作爲根元素,它工作正常。但是,當我嘗試使用根據this response<merge>標籤我得到這個錯誤:

<merge /> can be used only with a valid ViewGroup root and attachToRoot=true

我的XML佈局是這樣的:

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

    <CheckBox 
     ... /> 

    <TextView 
     ... /> 

</merge> 

我也試圖從<merge... >標籤中刪除所有的屬性,得到了相同的結果。怎麼了?

UPDATE:上面的代碼是正確的。 如提到secretlm,問題是,<merge>用作root element並充氣在另一塊OD代碼:

ArrayAdapter<String> adapter = 
    new ArrayAdapter<String>(this, 
          R.layout.layers_list_item, 
          R.id.layers_list_item_text); 

並與每一個元素加到適配器試圖膨脹R.layout.layers_list_item具有<merge>作爲根。

+0

你能否在標籤更新你的兒童意見? – secretlm

+0

@secretlm當然。 –

回答

21

在最終佈局中不能使用<merge>作爲root element沒有容器元素。 「當你知道這個佈局將被放置到一個已經包含合適的父視圖來包含元素的子元素的佈局中時,使用這個作爲根元素是非常有用的,當你打算在另一個佈局中包含這個佈局時,文件中使用這種佈局不要求有不同的ViewGroup容器」 - 從‘developer.android.com’

這個例子表明,如何與<merge>工作:http://www.coderzheaven.com/2011/06/26/merge-two-layout-xml-in-android/

更新時間:

您應該嘗試使用此示例中的構造函數(Context,AttributeSet)。我認爲它會解決你的問題。

文件的test.xml:

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

    <CheckBox 
     android:id="@+id/layers_list_item_switch" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignRight="@id/layers_list_item_root"  
     android:layout_alignParentRight="true" 
     android:layout_marginLeft="15dp"   
     android:button="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/layers_list_item_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="left|center_vertical" 
     android:layout_toLeftOf="@id/layers_list_item_switch" 
     android:selectAllOnFocus="true" 
     android:text="tret" 
     android:ellipsize="marquee" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:marqueeRepeatLimit="marquee_forever" 
     android:singleLine="true" 
     android:scrollHorizontally="true" 
     android:textColor="@android:color/black" 
     android:textSize="16sp" 
     android:textStyle="bold" 
     android:typeface="serif" 
     android:clickable="true" /> 

</merge> 

Test類從RelativeLayout的延伸:

public class Test extends RelativeLayout 
{  
    public Test(Context context, AttributeSet attrs) { 
     super(context, attrs);  
     LayoutInflater.from(context).inflate(R.layout.test, this, true);  
    } 
} 

主要活動:

public class MainActivity extends Activity { 

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

主要佈局:

<com.example.testlayout.Test 
    xmlns:android="http://schemas.android.com/apk/res/android"   
    android:id="@+id/layers_list_item_root" 
    android:layout_height = "fill_parent" 
    android:layout_width = "fill_parent"  
    /> 
+0

''不是'根元素' - 它被附加到'CustomView',它是'RelativeLayout'。 無論如何,在更高層次上還有另一個佈局 - 'CustomView'只是描述'ListView'項目。 –

+1

@Frederic:我更新了我的答案,希望它能解決您的問題。 – secretlm

+0

好吧,你是對的'根元素' - xml與''作爲'root'在'ArrayAdapter'構造函數中使用,並在它內部膨脹導致錯誤 –