getResourceId не находит идентификатор в пользовательском элементе управления
Я пытаюсь создать элемент управления (панель, которая расширяется и сжимается при щелчке по заголовку), и я нашел некоторый код в Интернете. В конструкторе у меня есть
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, так что кто-нибудь может увидеть что-нибудь в моем коде обработки атрибутов?
2 ответа
Догадаться. Оказывается, атрибуты должны быть пространством имен в 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"
После того, как я добавил их, он нашел значения просто отлично.
Вы добавили ресурсы в файл values-> attrs.xml?
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyControl">
<attr name="headerId" format="integer" />
</declare-styleable>
</resources>