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>
Другие вопросы по тегам