我正在尝试创建一个控件(单击标题时会展开和收缩的面板),并且在网上找到了一些代码。在构造函数中,我有
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyControl);
...
int headerId = array.getResourceId(R.styleable.MyControl_header, -1);
在具有以下XML的布局文件中创建控件:
<MyControl
android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/drawer"
header="@+id/header" content="@+id/drawerContent"
android:layout_below="@id/contentContainer" android:background="#00FF00">
<TextView android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@id/header"
android:text="This is a header"/>
<TextView android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@id/drawerContent"
android:text="@string/sample_text" />
</MyControl>
问题是
getResourceId()
返回-1(即似乎无法找到设置为该属性的资源)。知道为什么吗?
编辑:忘记包括我的attrs.xml文件:
<resources>
<declare-styleable name="MyControl">
<attr name="collapsedHeight" format="dimension" />
<attr name="header" format="reference" />
<attr name="content" format="reference" />
<attr name="animationDuration" format="integer" />
</declare-styleable>
编辑2:不知何故,我不认为要检查其他属性-我添加了几个其他属性。我也在调试器中检查了它们的值,看起来它们也是默认值。因此,
getResourceId
并不是问题,这与我通常获取属性的方式有关。我是Android新手,所以有人可以在我的属性处理代码中看到任何内容吗? 最佳答案
弄清楚了。事实证明,必须在XML中对属性进行命名空间。我放
<MyControl
android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/drawer"
header="@+id/header" content="@+id/drawerContent"...
但它必须是
<MyControl xmlns:myPackage="http://schemas.android.com/apk/res/com.my.package"
android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/drawer"
myPackage:header="@+id/header" myPackage:content="@+id/drawerContent"
在添加完这些之后,它发现这些值就很好了。