2014-01-15 75 views
4

我在special_button.xml中有一個按鈕,A,我可以在所有活動中重複使用該按鈕。每個活動都有一個根RelativeLayout在xml中的「包含」佈局中引用視圖的ID

問題:我的一項活動有一個按鈕,B,位置與A相同。我決定只將B移到A以上,但我不能從活動的xml中引用A

這裏有個XML

special_button.xml

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

    <Button 
     android:id="@+id/A" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_marginBottom="15dp" 
     android:layout_marginRight="20dp"/> 

</merge> 

layout_main.xml

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

    <include layout="@layout/special_button" /> 

    <Button 
     android:id="@+id/B" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_above="<id to reference button A>" 
     android:layout_marginBottom="15dp" 
     android:layout_marginRight="20dp" /> 

</RelativeLayout> 

回答

4

當您使用include標記時,您還應該在該XML中指定一個新ID,然後您可以在RelativeLayout內指定該ID。通過在標籤指定它們包含佈局的根視圖查看documentation這個示例代碼:

您還可以覆蓋所有的佈局參數(layout_ *屬性任何Android)。例如:

<include android:id=」@+id/news_title」 
    android:layout_width=」match_parent」 
    android:layout_height=」match_parent」 
    layout=」@layout/title」/> 

編輯:由於@ eskimoapps.com指出的,似乎是一個已知的問題與RelativeLayout在做這一點,因爲記錄here,但是當我運行下面的代碼,這是工作如OP請求:

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

    <include layout="@layout/special_button" 
     android:id="@+id/btn_a_ref" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     /> 

    <Button 
     android:id="@+id/B" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_above="@+id/A"  <!-- this still works, despite having warning in Eclipse --> 
     android:layout_marginBottom="15dp" 
     android:layout_marginRight="20dp" /> 

</RelativeLayout> 

下面是從HierarchyViewer顯示正確的佈局圖:id/A下面id/B

enter image description here

我唯一的想法是Eclipse不喜歡它,因爲它靜態地試圖在相同的佈局文件中找到Button。由於<include><merge>與LayoutManager動態協同工作,這可能仍然按預期工作。

請試試看看它是否適合您。

+0

我試過這個。這種方法的問題是,id被賦予了包含的佈局的根。就我而言,它是'merge'標籤,它實際上是活動的'RelativeLayout'。我仍然無法使用A按鈕。 – aysonje

+0

如果您爲「RelativeLayout」的id不同的''給出了一個id,那麼您的陳述是不正確的。請檢查我的編輯,看看是否有幫助。 – anddev84

+0

哇。謝謝!我不知道你可以直接引用'A'。只是爲了讓你知道,我沒有添加任何數據到''標籤,簡單地說:''並且它工作。 – aysonje

0

您可以在id屬性添加到您的<include>這樣的:

<include android:id=」@+id/someId」 
     layout=」@layout/special_button」/> 
+0

我試過這個。這種方法的問題是,id被賦予了包含的佈局的根。就我而言,它是'merge'標籤,它實際上是活動的'RelativeLayout'。我仍然無法訪問按鈕A. – aysonje

+0

您將無法使用此方法直接從XML中引用按鈕A,但現在可以引用您在「」中定義的新ID。這將在你提到的'layout_above'值中起作用。 – anddev84

+0

如果正在使用合併標記(id,visibility和layout_ *標記被忽略),這實際上不起作用,並且如果未指定layout_width和layout_height,則也不起作用,請參閱http:// stackoverflow。com/questions/2316465/how-to-get-relativelayout-working-merge-and-include – eski

相關問題