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

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

Как это работает?

  • Каков задействованный механизм?
  • Что означают синтаксические элементы, такие как "?", "attr", "activateBackgroundIndicator"?
  • где указано значение "активированныйBackgroundIndicator"?

Ответ 1

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

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

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

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

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

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

В принципе, активированBackgroundIndicator не является фактическим, но доступен для ссылки. Итак, где собственно атрибут "activateBackgroundIndictor"?

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

path_to_android_sdk/платформы/Android-17/<сильные > данные/RES/значения/attrs.xml

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

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

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

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

path_to_android_sdk/платформы/Android-17/<сильные > данные/RES/значения/themes.xml

Если вы откроете этот файл, вы увидите несколько определений в зависимости от темы, которую вы используете. Например, вот определения для темы name Theme, Theme.Light, Theme.Holo, Theme.Holo.Light соответственно:

<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>

Теперь у нас есть наши таинственные возможности. Если вы выбираете первый, он определяется в папке с возможностью переноса по адресу:

path_to_android_sdk/платформы/Android-17/<сильные > данные/RES/вытяжка/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.

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

Ответ 2

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

  • android:background будет иметь возможность рисования.
  • Синтаксис находится в стиле

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

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

Вы также сможете получить доступ к этому коду с помощью android.R.attr.activatedBackgroundIndicator.

Список свойств Android attr можно найти по адресу R.attr

  • activatedBackgroundIndicator - это определенный переносимый в Android 3.0+ как

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

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

Ответ 3

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

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

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

  • Создайте свою собственную тему (это просто причудливое имя для ресурса "style" ), чаще всего исходя из одной из стандартных тем.
  • Поставьте свое собственное значение для данного атрибута.

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

Edit

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

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

Ответ 4

numan salati уже предложил отличный ответ, но он не обратился к "?" синтаксис. Здесь приведена цитата из руководства API Доступ к ресурсам

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

[< имя_пакет > :]? [& Л; resource_type > /] <resource_name >