2012-01-20 59 views
8

根據這個CommonsWare的例子,我設法讓我的RelativeLayout子類與我的佈局合併在一個xml佈局中用合併根描述。我唯一擔心的是我無法在xml中描述我的RelativeLayout參數。從合併佈局到RelativeLayout通過膨脹的XML屬性

我的XML佈局:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:my="http://schemas.android.com/apk/res/hu.someproject" 
    android:layout_width="36dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="3dp" 
    android:layout_marginRight="3dp" 
    android:width="36dp" > 

<RelativeLayout 
    android:id="@+id/upper_container" 
    style="?pretty_style" 
    android:layout_alignLeft="@+id/image_title" 
    android:layout_alignParentTop="true" 
    android:layout_alignRight="@+id/image_title" 
    android:layout_centerHorizontal="true" > 

    <View 
     android:id="@+id/upper_indicator" 
     android:layout_width="fill_parent" 
     android:layout_height="5dp" 
     android:layout_alignParentTop="true" 
     android:background="@color/mycolor" /> 

    <TextView 
     android:id="@+id/text_degree" 
     style="?pretty_style" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="23°" /> 
</RelativeLayout> 

<hu.MyView 
    android:id="@+id/image_title" 
    style="?my_image_title" 
    android:layout_below="@+id/upper_container" 
    android:layout_centerHorizontal="true" 
    my:myColor="#2f8741"/> 

我認爲這個問題是合併發生合併標籤的孩子,而不是合併本身。任何想法如何讓我的參數在合併影響我的RelativeLayout?

我RelativeLayout的子類,沒有包聲明,進口:

public class MyRelativeLayoutSubclass extends RelativeLayout { 

    public MyRelativeLayoutSubclass(Context context) { 
     super(context); 

     initTile(null); 
    } 

    public MyRelativeLayoutSubclass(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     initTile(attrs); 
    } 

    public MyRelativeLayoutSubclass(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initTile(attrs); 
    } 

    private void initTile(Object object) { 
     final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.my_great_little_layout, this, true); 
    } 
} 

我知道我可以添加一切到的LayoutParams,然後與的LayoutParams加我MyRelativeLayoutSubclass,但我想逃脫,這是一個很大不必要的代碼。

回答

17

我認爲問題是合併發生在合併標籤的子元素上,而不是合併本身。

AFAIK,你是對的。 <merge>是佔位符,不是ViewGroup

我知道我可以添加一切到的LayoutParams,然後與添加的LayoutParams我MyRelativeLayoutSubclass,但我想逃脫,這是一個很大的不必要的代碼。

創建一個包含MyRelativeLayoutSubclass元素的XML佈局文件,並將其屬性放在那裏。然後,膨脹那個佈局。

+0

這是一個非常明顯的解決方案,我不知道爲什麼我錯過了它。 – gmate

+0

儘管它不容許你擁有默認屬性。每次使用我的自定義組件時,我都必須重新輸入它們。 – Timmmm

+0

@Timmmm:'MyRelativeLayoutSubclass'當然可以具有屬性的默認值,當它嘗試從XML中讀取屬性(並且未能遇到它們)時使用。 – CommonsWare

1

將所有屬性提取到Style中對我來說是一個解決方案。與硬編碼屬性或Java代碼不同,它的屏幕尺寸依賴於,因此與不同。也許你可以進一步把它放到主題屬性中。

<com.example.widget.MyCustomView 
    android:id="@+id/my_custom_view" 

    style="@style/MyCustomView.Default"/> 
+0

屬性和程序化LayoutParams可以取決於屏幕大小。 – Xiao