Если вы настроены криминалистически, вот как выкопать и узнать, что происходит.
android:background="?android:attr/activatedBackgroundIndicator"?
Интуитивно это означает, что фон должен быть доступен для рисования.
Но давайте разберем это дальше, чтобы увидеть, как мы добираемся до нашего загадочного drawable.
Если быть точным, это означает «установить для атрибута фона то, на что ссылается атрибут« activateBackgroundIndicator » в текущей теме .
Если вы понимаете часть «относится к текущей теме», вы в основном понимаете все, что происходит за кулисами.
По сути, activateBackgroundIndicator не является фактическим объектом для рисования, а является ссылкой на объект для рисования . Так где же на самом деле определяется атрибут «activateBackgroundIndictor»?
Он определен в вашем каталоге sdk в имени файла attrs.xml . Например:
путь_к_андроид_сдк / платформы / android-17 / данные / res / значения / attrs.xml
Если вы откроете этот файл, вы увидите следующее объявление:
<attr name="activatedBackgroundIndicator" format="reference" />
attrs.xml - это место, где вы объявляете все атрибуты, которые позже собираетесь использовать в своем представлении xml. Обратите внимание, что мы объявляем атрибут и его тип, а не присваиваем здесь значение .
Фактическое значение задается в themes.xml . Этот файл находится по адресу:
путь_к_андроид_сдк / платформы / android-17 / данные / res / значения / 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>
Теперь у нас есть загадочные чертежи. Если вы выберете первый, он будет определен в папке с возможностью переноса по адресу:
путь_к_андроид_сдк / платформы / android-17 / данные / res / вытяжка / активированный_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>
Здесь мы определяем чертеж с двумя состояниями - состояние по умолчанию - это просто прозрачный фон, а если состояние - «state_activated», то наш чертеж - «list_selector_background_selected».
см. эту ссылку для получения справочной информации о чертежах и состояниях.
list_selector_background_selected - это png-файл с исправлениями 9, который находится в папке drawable-hdpi.
Теперь вы можете понять, почему мы определили activeBackgroundIndicator как ссылку, а не напрямую ссылаемся на файл с возможностью рисования - это позволяет вам выбрать правильный файл в зависимости от вашей темы.
selector
работой с использованием чертежей. Прочитав это, я использовал Документы атрибутов стиля, чтобы заполнить оставшиеся части.Я тоже задавался вопросом об этом в какой-то момент. Большая часть ресурсов Android кажется черным ящиком и не может быть видна напрямую. Мне может где-то их не хватать, но я не могу найти их в исходном коде SDK. Вот что я знаю.
android:background
займет вытяжку.В этом случае
?
означает, что нужно посмотреть на тему в пакете,android
и она имеет тип, вattr
котором указано ее имяactivatedBackgroundIndicator
.Вы также должны иметь доступ к этому в коде программной части с помощью
android.R.attr.activatedBackgroundIndicator
.Список
attr
свойств Android можно найти на R.attr.activatedBackgroundIndicator
- это определенная возможность рисования в Android 3.0+ какПо сути, это просто стандартный элемент, определенный в ОС. Я не могу найти в исходниках Android, но вот ссылка на документацию. activeBackgroundIndicator
источник
Это форма присвоения значения из темы. Значение технически неизвестно во время компиляции ресурса, потому что значения темы могут быть неизвестны в этот момент. Вместо этого значение определяется во время выполнения на основе фактической темы, взятой из (чаще всего)
ContextThemeWrapper
.Это дает возможность повторно использовать значения ресурсов. Я говорю не о производительности, а об организации и обслуживании. Атрибут действует как переменная с обещанием, что он будет хранить фактическое значение во время выполнения.
Этот подход также допускает большую настройку - вместо жесткого кодирования значения, например, для рисования фона окна, он получает фактическое рисование из темы, предоставляя выбранный атрибут в качестве ключа. Это позволяет вам переопределить значение этого атрибута. Вам просто необходимо:
Платформа будет автоматически использовать ваше значение при условии, что вы указали тему для действия или приложения. Вы делаете это, как описано в вопросе. Общий синтаксис ссылок на атрибуты темы описан здесь: Ссылка на атрибуты стиля . Вы также найдете там пример и описание всего механизма.
редактировать
Следует отметить фактические имена атрибутов и их существование в различных версиях платформы. Довольно часто новые атрибуты вводятся в следующих версиях платформы - например, некоторые из них были добавлены в версии 3.0 с целью стилизации ActionBar.
Вы должны рассматривать имена атрибутов как часть API - другими словами, они являются частью контракта, который вам разрешено использовать. Это очень похоже на классы и их сигнатуры - вы используете
LocationManager
класс для получения последнего местоположения устройства, потому что вы знаете из какого-либо источника (учебные пособия, справочные материалы, официальные руководства и т. Д.), Какова цель этого класса. Точно так же имена атрибутов и их назначение (иногда хорошо, иногда плохо) определены в документации по платформе Android.источник
Обновление: в Руководстве по API доступна более подробная версия, поэтому я хотел бы процитировать ее.
Оригинальный ответ:
numan salati уже предложил идеальный ответ, но не обратился к "?" синтаксис. Вот цитата из Руководства по API Доступ к ресурсам
источник