Стиль пользовательского виджета 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);