Как же так"?android: attr / activatedBackgroundIndicator " работа?



Я искал, как выделить выбранный элемент в списке при отображении контекстной панели действий для выбора, и решение, которое я нашел, состояло в том, чтобы установить android:background атрибут моей строки макета xml в "?android:attr/activatedBackgroundIndicator".



Как это работает, хотя?




  1. какой механизм задействован?

  2. что такое элементы синтаксиса, как "?", "привлекательность", "activatedBackgroundIndicator" имеете в виду?

  3. где смысл "activatedBackgroundIndicator" определен?

323   4  

4 ответов:

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

android:background="?android:attr/activatedBackgroundIndicator"?

интуитивно это означает, что установить фон для некоторых drawable.

но давайте разложим это дальше, чтобы увидеть, как мы добираемся до нашего таинственного drawable.

если быть точным, это означает "установить атрибут фона на то, что атрибут "activatedBackgroundIndicator"относится к текущей теме.

если вы понимаете "относится к в текущая тема " часть, вы в основном поняли все, что происходит за обложками.

по сути, activatedBackgroundIndicator не является фактическим drawable но ссылка на drawable. Так где же на самом деле определен атрибут" activateBackgroundIndictor"?

он определен в вашем каталоге sdk в имени файла attrs.xml. Например:

path_to_android_sdk / platforms / android-17/data/res/values / attrs.xml

если вы откроете этот файл, вы получите следующее объявление:

<attr name="activatedBackgroundIndicator" format="reference" />

attrs.xml-это место, где вы объявляете все атрибуты, которые вы позже собираетесь использовать в своем представлении xml. Примечание мы объявляем атрибут и его тип и фактически не присваиваем значение здесь.

фактическое значение присваивается в темы.xml. Этот файл находится по адресу:

path_to_android_sdk / platforms / android-17/данные / res / значения / темы.xml

если вы откроете этот файл, вы увидите несколько определений в зависимости от того, какую тему вы используете. Например, вот определения для темы название темы, тема.Свет, Тема.Голо, Тема.Голографический.Свет соответственно:

<item name="activatedBackgroundIndicator">@android:drawable/activated_background</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item>

теперь у нас есть наши таинственные рисунки. Если вы выберете первый, это определяется в папке drawable по адресу:

path_to_android_sdk / platforms / android-17/data/res/drawable / activated_background.xml

если вы откроете этот файл, вы увидите определение drawable, которое важно для понимания того, что происходит.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" />
    <item android:drawable="@color/transparent" />
</selector>

здесь мы определяем drawable с двумя состояниями - состояние по умолчанию - это просто прозрачный фон, и если состояние "state_activated", то наш drawable "list_selector_background_selected".

посмотреть этой ссылке для получения справочной информации о чертежах и состояниях.

"list_selector_background_selected" представляет собой 9 патч png файл, который находится в папке drawable-hdpi.

теперь вы можете понять, почему мы определили activatedBackgroundIndicator в качестве ссылки, а не ссылки непосредственно на файл drawable - это позволяет выбрать правильный drawable в зависимости от вашей темы.

я тоже задавался этим вопросом в какой-то момент. Большое количество ресурсов Android похоже на черный ящик и не может видеть их напрямую. Я могу пропустить их где-то, но я не могу найти их в исходном коде SDK. Вот что я знаю.

  • android:background будет принимать drawable.
  • синтаксис в стиле

    должна быть ссылка на другой ресурс, в форме "@[+] [package:]type:name " или на атрибут темы в форме "?[пакет:][тип:]имя"

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

вы должны быть в состоянии получить доступ к этой в кода с android.R.attr.activatedBackgroundIndicator как хорошо.

список Android attr свойства можно найти в R. attr

  • activatedBackgroundIndicator это определенный drawable в Android 3.0 + как

    Drawable используется в качестве фона для активированных элементов.

это в основном просто стандартный элемент, определенный в ОС. Я не могу найти в источнике Android, но вот ссылка на документацию. activatedBackgroundIndicator

это форма прикрепления значения из темы. Значение технически не известно во время компиляции ресурсов, поскольку значения темы могут быть неизвестны в этот момент. Вместо этого значение решается во время выполнения на основе фактической темы, взятой из (Чаще всего) ContextThemeWrapper.

это дает возможность повторного использования значений ресурсов. Я не говорю здесь о производительности, а скорее об организации и обслуживании. Атрибут действует как переменная с обещанием, что он будет содержать фактическое значение во время выполнения.

этот подход также обеспечивает большую настройку - вместо жесткого кодирования значения, например, фона окна drawable он получает фактический drawable из темы, предоставляя выбранный атрибут в качестве ключа. Это позволяет вы изменить значение этого атрибута. Вам просто нужно:

  1. создайте свою собственную тему (которая является просто причудливым именем для ресурса "стиль"), чаще всего вытекающего из одного из значений по умолчанию тематика.
  2. укажите свое собственное значение для рассматриваемого атрибута.

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

Edit

одна вещь, которую следует отметить, это фактические имена атрибутов и их существование в различных версиях платформы. Это довольно часто для новых атрибутов, которые будут введены в следующих версиях платформы - например, некоторые были добавлены в версии 3.0 с целью стилизации ActionBar.

вы должны рассматривать имена атрибутов как часть API - другими словами, они являются частью контракта, который вам разрешено использовать. Это очень подобно классам и их сигнатурам-вы используете LocationManager класс для получения последнего местоположения устройства, потому что вы знаете из какого-то источника (учебники, справочники, официальные справочники и т. д.) какова цель этого занятия. Точно так же имена атрибутов и их назначение (иногда хорошо, иногда плохо) определены в документации платформы Android.

обновление: есть более подробная версия, доступная из руководства API, поэтому я хотел бы процитировать его.

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

для ссылки на атрибут стиля синтаксис имени почти идентичен обычному формату ресурса, но вместо символа at ( @ ) используйте знак вопроса (?), и часть типа ресурса является необязательной. Например:`

Оригинальный Ответ:

Нуман салати уже предложил идеальный ответ, но он не обратился к "?" синтаксис. Вот цитата из руководства API Доступ К Ресурсам

для ссылки на атрибут стиля синтаксис имени почти идентичен обычному формату ресурса, но вместо символа at ( @ ) используйте знак вопроса (?), и часть типа ресурса является необязательной. Например:

?[:][/]

Comments

    Ничего не найдено.