使用getAttributeResourceValue时,为什么需要指定XML命名空间?

时间:2012-07-20 09:12:21

标签: android

我一直在为一些自定义布局组件使用自定义属性而没有问题。到目前为止,我只使用了简单的属性(string,int等)。这些在values/attrs.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属性可以很好地避免这种情况。

我做错了什么或这是一个错误/预期的行为?

2 个答案:

答案 0 :(得分:2)

而不是使用行:

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集中不可用。

答案 1 :(得分:0)

我发现了我的问题。我正在浏览AttributeSet变量attrs,因为出于某种原因,我应该像使用其他属性一样使用TypedArray实例。这是有效的代码行:

int emptyLayoutInt = a.getResourceId(R.styleable.StaticGridView_emptyLayout, -1);