2012-07-20 70 views
0

我一直在使用一些自定義佈局組件的自定義屬性沒有問題。到目前爲止,我只使用簡單的屬性(string,int等)。這些都是像這樣定義的values/attrs.xml爲什麼在使用getAttributeResourceValue時需要指定XML名稱空間?

<declare-styleable name="StaticListView"> 
    <attr name="border_size" format="dimension" /> 
</declare-styleable> 

,並在我的佈局:

<de.example.androidapp.StaticListView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     namespace:border_size="1px" 
    /> 

,並使用像這樣:

int borderSize = (int) a.getDimension(R.styleable.StaticListView_border_size, 0); 

現在,我想要指定佈局一個自定義屬性,不能使用上面使用的R.styleable方法。

這裏是我如何定義屬性:

<declare-styleable name="StaticListView"> 
    <attr name="emptyLayout" format="reference" /> 
</declare-styleable> 

,並使用它:

<de.example.androidapp.StaticListView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     namespace:emptyLayout="@layout/empty" 
    /> 

這是我怎麼想使用它,但我總是得到默認值( -1):

int emptyLayoutInt = attrs.getAttributeResourceValue(R.styleable.StaticListView_emptyLayout, -1); 

然而,這作品:

int emptyLayoutInt = attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/de.example.androidapp", "emptyLayout", -1); 

我不喜歡硬編碼XML名稱空間。使用R.styleable屬性可以很好地避免這種情況。

我做錯了什麼或者這是一個錯誤/預期的行爲?

回答

1

而不是使用行:

int emptyLayoutInt = attrs.getAttributeResourceValue(R.styleable.StaticListView_emptyLayout, -1); 

使用此 -

TypedArray a = context.obtainStyledAttributes(attrs, 
      R.styleable.MyLayout); 
    int layoutId = a.getResourceId(R.styleable.MyLayout_text,-1); 

的-1被退回,因爲該值不在ATTR組可用。

+0

感謝您的建議。它沒有解決我的問題,但它確實導致我再次查看我沒有正確使用的TypedArray實例。 – 2012-07-20 11:33:05

+0

歡迎:)我忘了寫getResourceId。我正在對代碼進行最後的修改。 – 2012-07-20 11:47:45

0

我想通了我的問題。我正在通過AttributeSet變量attrs,因爲某些原因,但我應該像使用其他屬性一樣使用TypedArray實例。以下是可用的代碼行:

int emptyLayoutInt = a.getResourceId(R.styleable.StaticGridView_emptyLayout, -1); 
相關問題