Як працює “? Android: attr / activBackgroundIndicator”?


86

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

Як працює настройка цього режиму?

  1. який механізм задіяний?
  2. що означають такі елементи синтаксису, як "?", "attr", "activBackgroundIndicator"?
  3. де визначено значення "activBackgroundIndicator"?

Відповіді:


221

Якщо у вас криміналістичний настрій, ось як копати і з’ясувати, що відбувається.

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

Інтуїтивно це означає, що встановіть фон для певного малювання.

Але давайте розкладемо це далі, щоб побачити, як ми дійдемо до нашого таємничого малювального.

Якщо бути точнішим, це означає "встановити атрибут фону на те, до чого відноситься атрибут" activBackgroundIndicator " у поточній темі .

Якщо ви розумієте частину "посилання у поточній темі", ви в основному зрозуміли все, що відбувається за обкладинками.

По суті, activBackgroundIndicator - це не фактичний малювальник, а посилання на його . То де насправді визначено атрибут "activateBackgroundIndictor"?

Це визначено у вашому каталозі sdk в назві файлу attrs.xml . Наприклад:

path_to_android_sdk / platform / android-17 / data / res / values ​​/ attrs.xml

Якщо ви відкриєте цей файл, ви зробите декларацію наступним чином:

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

attrs.xml - це місце, де ви оголошуєте всі атрибути, які згодом будете використовувати у своєму поданні xml. Зверніть увагу, що ми оголошуємо атрибут та його тип, а насправді не призначаємо тут значення .

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

path_to_android_sdk / platform / android-17 / data / res / values ​​/ themes.xml

Якщо відкрити цей файл, ви побачите кілька визначень залежно від теми, яку ви використовуєте . Наприклад, ось визначення для назв тем 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 / data / res / drawable / activ_background.xml

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

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

Тут ми визначаємо, що можна малювати з двома станами - стан за замовчуванням - це просто прозорий фон, і якщо стан "активований", тоді наш малювальний файл "list_selector_background_selected".

дивіться це посилання для отримання довідкової інформації щодо чернеток та штатів.

"list_selector_background_selected" - це файл із 9 патчами у форматі PNG, який знаходиться в папці drawable-hdpi.

Тепер ви можете зрозуміти, чому ми визначили activBackgroundIndicator як посилання, а не як посилання безпосередньо на файл, який можна малювати - це дозволяє вибрати правильний малюнок залежно від вашої теми.


3
Одна відповідь, щоб керувати ними всіма. Отже, в основному, якби хтось робив XML з тими ж селекторами, він міг би зробити свій власний "activBackgroundIndicator"?
Gee.E

1
точно - ви можете перевизначити його у своєму користувацькому theme.xml b / c як атрибут посилання.
numan salati

Ця відповідь допомогла мені зрозуміти, як встановити користувацький малюнок для мого елемента списку шухляд навігації.
Tastybrownies

Це чудовий ресурс для того, щоб почати працювати над нестандартними selectorроботами за допомогою графічних засобів. Прочитавши це, я використав Документи атрибутів стилю для заповнення решти частин.
Мауріціо

1
Чи можете ви навести приклад того, як замінити цей фоновий індикатор? Мій не працює: / <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: activBackgroundIndicator"> @ drawable / activ_background </item> </style> activ_background.xml : <selector xmlns: android = " schemas.android.com/apk/res/android "> <item android: state_activate = "true" android: drawable = "@ color / yellow" /> <item android: drawable = "@ android: color / transparent "/> </selector>
vandus

13

Я теж дивувався цьому в один момент. Велика кількість ресурсів Android схожа на чорну скриньку і не бачить їх безпосередньо. Можливо, вони десь відсутні, але я не можу знайти їх у вихідному коді SDK. Ось що я знаю.

  • android:background візьме малюнок.
  • Синтаксис у стилі

    Це має бути посилання на інший ресурс у формі "@ [+] [package:] type: name" або на атрибут теми у формі "? [Package:] [type:] name"

У цьому випадку ?означає подивитися на тему в пакеті, androidі вона має тип, attrде є ім'я activatedBackgroundIndicator.

Ви також повинні мати доступ до цього в коді ззаду android.R.attr.activatedBackgroundIndicator.

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

  • activatedBackgroundIndicator є визначеним малюнком в Android 3.0+ як

    Малюнок, що використовується як фон для активованих елементів.

В основному це просто стандартний елемент, визначений в ОС. Не вдається знайти в джерелі Android, але тут є посилання на документацію. activBackgroundIndicator


5

Це форма додавання значення до теми. Значення технічно невідомо під час компіляції ресурсів, оскільки значення теми можуть бути невідомі на той момент. Натомість значення вирішується під час виконання на основі фактичної теми, взятої з (найчастіше) ContextThemeWrapper.

Це забезпечує спосіб повторного використання значень ресурсів. Я тут не кажу про ефективність, а швидше про організацію та технічне обслуговування. Атрибут діє як змінна, обіцяючи, що він буде мати фактичне значення під час виконання.

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

  1. Створіть свою власну тему (що є просто вигаданою назвою для ресурсу "стилю"), найчастіше виходячи з однієї із тем за замовчуванням.
  2. Введіть своє значення для відповідного атрибута.

Платформа автоматично використовуватиме ваше значення за умови, що ви вказали свою тему для діяльності чи програми. Ви робите це, як описано у запитанні. Тут описаний загальний синтаксис посилань на атрибути теми: Атрибути стилю посилання . Ви також знайдете там приклад і опис всього механізму.

Редагувати

Одне, на що слід звернути увагу, - це фактичні імена атрибутів та їх існування у різних версіях платформи. Досить часто нові атрибути можуть бути введені в наступних версіях платформи - наприклад, деякі були додані у версії 3.0 з метою стилю ActionBar.

Ви повинні розглядати імена атрибутів як частину API - іншими словами, вони є частиною контракту, який вам дозволено використовувати. Це дуже схоже на класи та їх підписи - ви використовуєте LocationManagerклас з метою отримання останнього розташування пристрою, оскільки ви знаєте з деяких джерел (навчальні посібники, довідкові матеріали, офіційні путівники тощо), яка мета цього класу. Подібним чином, назви атрибутів та їх призначення (іноді добре, іноді жалюгідно) визначаються в документації платформи Android.


2

Оновлення: У посібнику API є більш детальна версія, тому я хотів би процитувати її.

Ресурс атрибутів стилю дозволяє посилатися на значення атрибута в поточній темі. Посилання на атрибут стилю дозволяє вам налаштувати зовнішній вигляд елементів інтерфейсу, стилізуючи їх відповідно до стандартних варіацій, що надаються поточною темою, замість того, щоб надавати жорстко закодоване значення. Посилання на атрибут стилю, по суті, говорить: "використовуйте стиль, визначений цим атрибутом, у поточній темі".

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

Оригінальна відповідь:

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

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

? [<ім'я_пакета>:] [<тип_ресурсу> /] <ім'я_ресурсу>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.