Мне нужно реализовать свои собственные атрибуты, как в com.android.R.attr
В официальной документации ничего не найдено, поэтому мне нужна информация о том, как определить эти атрибуты и как их использовать из моего кода.
android
android-resources
android-attributes
Александр Олейников
источник
источник
Ответы:
На данный момент лучшей документацией является источник. Вы можете посмотреть на это здесь (attrs.xml) .
Вы можете определить атрибуты в верхнем
<resources>
элементе или внутри<declare-styleable>
элемента. Если я собираюсь использовать attr в нескольких местах, я помещаю его в корневой элемент. Обратите внимание, что все атрибуты имеют одно и то же глобальное пространство имен. Это означает, что даже если вы создадите новый атрибут внутри<declare-styleable>
элемента, его можно будет использовать вне его, и вы не сможете создать другой атрибут с тем же именем другого типа.<attr>
Элемент имеет два атрибута XMLname
иformat
.name
позволяет назвать это что - то и это, как вы в конечном итоге со ссылкой на него в коде, например,R.attr.my_attribute
.format
Атрибут может иметь разные значения в зависимости от «типа» атрибута вы хотите.Вы можете установить формат для нескольких типов, используя
|
, например,format="reference|color"
.enum
атрибуты могут быть определены следующим образом:flag
атрибуты похожи, за исключением того, что значения должны быть определены, чтобы их можно было объединить в биты:Помимо атрибутов есть
<declare-styleable>
элемент. Это позволяет вам определять атрибуты, которые может использовать пользовательский вид. Вы делаете это, указывая<attr>
элемент, если он был определен ранее, вы не указываетеformat
. Если вы хотите повторно использовать атрибут Android, например, Android: gravity, то вы можете сделать этоname
следующим образом.Пример пользовательского представления
<declare-styleable>
:При определении ваших пользовательских атрибутов в XML в вашем пользовательском представлении вам нужно сделать несколько вещей. Сначала вы должны объявить пространство имен, чтобы найти ваши атрибуты. Вы делаете это на корневом элементе макета. Обычно есть только
xmlns:android="http://schemas.android.com/apk/res/android"
. Вы должны теперь также добавитьxmlns:whatever="http://schemas.android.com/apk/res-auto"
.Пример:
Наконец, для доступа к этому пользовательскому атрибуту вы обычно делаете это в конструкторе своего пользовательского представления следующим образом.
Конец. :)
источник
View
: github.com/commonsguy/cw-advandroid/tree/master/Views/…xmlns:my="http://schemas.android.com/apk/lib/my.namespace"
- не копировать attrs.xml. Обратите внимание, что путь URI пространства имен должен быть / apk / * lib *, а не / apk / res.apk/lib
уловка не работала для меня на пользовательских атрибутах с форматом ссылки из проекта библиотеки. Что же работа заключалась в использованииapk/res-auto
, как это было предложено в stackoverflow.com/a/13420366/22904 чуть ниже , а также в stackoverflow.com/a/10217752enum
иflag
: первое позволяет нам выбирать одно и только одно значение, второе позволяет объединять несколько. Я написал более длинный ответ на подобный вопрос здесь , и теперь, найдя этот вопрос, я решил связать его с этим.a.recycle()
здесь очень важно освободить памятьОтвет Qberticus хорош, но одна полезная деталь отсутствует. Если вы реализуете их в библиотеке, замените:
с:
В противном случае приложение, которое использует библиотеку, будет иметь ошибки во время выполнения.
источник
Ответ выше охватывает все очень подробно, за исключением нескольких вещей.
Во-первых, если нет стилей, то
(Context context, AttributeSet attrs)
сигнатура метода будет использоваться для создания экземпляра предпочтения. В этом случае просто используйте,context.obtainStyledAttributes(attrs, R.styleable.MyCustomView)
чтобы получить TypedArray.Во-вторых, он не охватывает, как обращаться с ресурсами plaurals (количество строк). Это не может быть решено с помощью TypedArray. Вот фрагмент кода из моего SeekBarPreference, который устанавливает сводку предпочтения, форматируя его значение в соответствии со значением предпочтения. Если xml для предпочтения устанавливает android: summary в текстовую строку или в строку resouce, значение предпочтения форматируется в строку (в ней должно быть% d, чтобы получить значение). Если для android: summary задан ресурс plaurals, то он используется для форматирования результата.
notifyChanged()
метод предпочтенияonDialogClosed
.источник
Традиционный подход полон стандартного кода и неуклюжей обработки ресурсов. Вот почему я сделал каркас Spyglass . Чтобы продемонстрировать, как это работает, вот пример, показывающий, как создать собственное представление, отображающее заголовок String.
Шаг 1: Создайте пользовательский класс представления.
Шаг 2: Определите строковый атрибут в
values/attrs.xml
файле ресурсов:Шаг 3: Примените
@StringHandler
аннотацию кsetTitle
методу, чтобы сообщить платформе Spyglass о необходимости перенаправить значение атрибута этому методу при завышении представления.Теперь, когда у вашего класса есть аннотация Spyglass, платформа Spyglass обнаружит его во время компиляции и автоматически сгенерирует
CustomView_SpyglassCompanion
класс.Шаг 4. Используйте сгенерированный класс в
init
методе пользовательского представления :Вот и все. Теперь, когда вы создаете экземпляр класса из XML, собеседник Spyglass интерпретирует атрибуты и выполняет требуемый вызов метода. Например, если мы надуваем следующий макет, то в качестве аргумента
setTitle
будем вызывать"Hello, World!"
.Фреймворк не ограничивается строковыми ресурсами, имеет множество различных аннотаций для обработки других типов ресурсов. Он также имеет аннотации для определения значений по умолчанию и для передачи значений заполнителей, если ваши методы имеют несколько параметров.
Взгляните на репозиторий Github для получения дополнительной информации и примеров.
источник
android:title="@{"Hello, world!"}"
.если вы опустите
format
атрибут вattr
элементе, вы можете использовать его для ссылки на класс из макетов XML.Refactor > Rename
работаетFind Usages
работаетне указывайте
format
атрибут в ... / src / main / res / values / attrs.xmlиспользовать его в каком-то файле макета ... / src / main / res / layout / activity__main_menu.xml
разобрать класс в коде инициализации вашего представления ... / src / main / java /.../ MyCustomView.kt
источник