Стиль пользовательского виджета Android: как помещать их в пространство имен?

В ApiDemos есть пример вида Gallery1, который объявляет пользовательский стиль в attrs.xml, как таковой:

<declare-styleable name="Gallery1">
    <attr name="android:galleryItemBackground" />
</declare-styleable>

теперь, я хочу сделать то же самое для своих виджетов, но используя другое пространство имен. Однако, как только я заменю пространство android: namespace чем-то другим, я получаю эту ошибку:

ОШИБКА: В Gallery1 не удается найти атрибут myns: galleryItemBackground

Невозможно найти атрибут? Почему он ищет атрибут, который я собираюсь объявить? Разве это не значит, что этот файл может называть ваши собственные пользовательские атрибуты?

Интересно отметить, что он работает, если вы не предоставляете собственное пространство имен, а просто имя атрибута.

Ответы

Ответ 1

У меня была аналогичная проблема, в результате чего появилось сообщение об ошибке Идентификатор ресурса не найден для атрибута в пакете

Решение для меня заключалось в том, чтобы объявить пространство имен при использовании пользовательского атрибута.

В вашем XML файле, где вы используете свой настраиваемый атрибут, укажите:

xmlns:myns="http://schemas.android.com/apk/res-auto"

...

<gallery.widget.package.Gallery1


myns:myCustomAttr="xxx"
/>

Ответ 2

В случае, если кто-то все еще интересуется, у меня была такая же проблема, и я решил его добавить, добавив атрибут "format" (кажется, что он не принимает "string" в качестве значения по умолчанию):

<attr name="android:galleryItemBackground" format="integer"/>

Ответ 3

Я нашел эта статья, полезная в аналогичной ситуации.

"Ссылаясь на наши новые атрибуты, на самом деле это двухэтапный процесс. Сначала мы объявили новое пространство имен, а затем мы указали значения наших новых атрибутов в использовании XML".

Ответ 4

создайте xml файл и вставьте этот ниже код и поместите в папку res- > values ​​

<declare-styleable name="Gallery1">
    <attr name="android:galleryItemBackground" />
</declare-styleable>

а затем скопируйте ниже код

TypedArray typedArray=this.obtainStyledAttributes(R.styleable.Gallery1);
        int back=typedArray.getResourceId(R.styleable.Gallery1_android_galleryItemBackground, 0);
        typedArray.recycle();

и установить в фоне виджета у меня означает imageView.setBackgroundResource(back);