我一直在为一些自定义布局组件使用自定义属性而没有问题。到目前为止,我只使用了简单的属性(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
属性可以很好地避免这种情况。
我做错了什么或这是一个错误/预期的行为?
答案 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);