1

我一直在为一些自定义布局组件使用自定义属性,没有问题。到目前为止,我只使用了简单的属性(字符串、整数等)。这些定义如下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属性可以很好地避免这种情况。

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

4

2 回答 2

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);

The -1 is getting returned because the value is not available in the attr set.

于 2012-07-20T09:53:34.877 回答
0

I figured out my problem. I was going through the AttributeSet variable attrs, because for some reason, but I should have been using the TypedArray instance like I do with the rest of the attributes. Here's the line of code that works:

int emptyLayoutInt = a.getResourceId(R.styleable.StaticGridView_emptyLayout, -1);
于 2012-07-20T11:32:13.707 回答