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

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

Как настроить эту работу?

  1. Каков механизм?
  2. что означают синтаксические элементы, такие как «?», «attr», «activatedBackgroundIndicator»?
  3. где обозначается значение «активированныйBackgroundIndicator»?

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

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

Интуитивно это означает, что фон может быть выделен.

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

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

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

В принципе, activeBackgroundIndicator не является фактическим, но может использоваться для ссылки . Итак, где собственно атрибут «activateBackgroundIndictor»?

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

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

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

  

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

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

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

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

 @android:drawable/activated_background @android:drawable/activated_background_light @android:drawable/activated_background_holo_dark @android:drawable/activated_background_holo_light 

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

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

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

     

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

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

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

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

Я тоже подумал об этом. Большое количество ресурсов для 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

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

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

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

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

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

редактировать

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

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

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

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

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

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

numan salati уже предложил прекрасный ответ, но он не обратился к «?» синтаксис. Вот цитата из Руководства API по доступу к ресурсам

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

? [<Имя_пакета>:] [ /]

  • Чтение APN в Android 4.2?
  • проверить приложение Android на переднем плане или нет?
  • Почему бы не использовать всегда android: configChanges = "keyboardHidden | orientation"?
  • Android: Можно ли отображать миниатюры видео?
  • Регистрация кнопки гарнитуры с помощью BroadcastReceiver на Android
  • Разрешение на разрешение прошивки Android?
  • Получить центр видимого элемента RecycleView при прокрутке
  • Постоянно скрывать панель навигации в действии
  • Расположение координатора с панелью инструментов во fragmentах или действиях
  • android Множественный выбор ListView & Textview
  • Timertask или обработчик
  • Interesting Posts

    Максимальная длина имени метода

    Зачем повторно инициировать DbContext при использовании Entity Framework?

    Как сортировать аррайалист объектов по свойству?

    пропорции перспективно-деформированного прямоугольника

    положение: абсолютное без установки сверху / влево / вправо / вправо?

    Неожиданное неволевое возвращаемое значение в функции void Swift3

    Зеркальное разделение внутреннего жесткого диска на внешний раздел жесткого диска

    android BluetoothDevice.getName () return null

    Зарубежный прокси делает Google Chrome, думаю, я в Германии или Нидерландах

    Ошибка HTTP 403.14 – Запрещено Веб-сервер настроен так, чтобы не отображать содержимое

    Установите IE10 в режим IE9 для определенных сайтов

    .NET. Как вы можете разделить строку с разделителями «caps» в массив?

    Можно ли создать маршрут ASP.NET MVC на основе субдомена?

    Ограничение 2 исходящих VPN-соединений любого типа из Windows 8.1 – как увеличить лимит?

    Галерея с фильтром папок

    Давайте будем гением компьютера.