Пользовательские стили виджетов Android: как поместить их в пространство имен? - PullRequest
17 голосов
/ 21 сентября 2009

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

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

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

ОШИБКА: в Gallery1 не удалось найти атрибут myns: galleryItemBackground

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

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

Ответы [ 4 ]

22 голосов
/ 18 сентября 2010

У меня была похожая проблема, приводящая к сообщению об ошибке Не найден идентификатор ресурса для атрибута в пакете

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

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

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

...

<gallery.widget.package.Gallery1


myns:myCustomAttr="xxx"
/>
8 голосов
/ 16 сентября 2011

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

<attr name="android:galleryItemBackground" format="integer"/>
1 голос
/ 29 июля 2011

создайте 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);

1 голос
/ 22 сентября 2009

Я нашел эту статью полезной в подобной ситуации.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...