Может кто-нибудь объяснить attr?

Я просматриваю пример кода Honeycomb Gallery (здесь) и запустил в следующем коде при попытке добавить элементы действия в мое собственное приложение:

<item android:id="@+id/camera"
    android:title="Camera"
    android:icon="?attr/menuIconCamera"
    android:showAsAction="ifRoom" />

?attr ставит меня в тупик. Может кто-нибудь объяснить, что это делает? Как это связано с возможностью рисования? Кажется, я не могу найти никакой хорошей информации в Google. Также есть ли список или галерея атрибутов, которые мы можем использовать для значков вместо просто menuIconCamera?

Спасибо

Изменить: я еще немного осмотрелся и обнаружил, что attrs.xml выглядит так:

<resources>
<declare-styleable name="AppTheme">
    <attr name="listDragShadowBackground" format="reference" />
    <attr name="menuIconCamera" format="reference" />
    <attr name="menuIconToggle" format="reference" />
    <attr name="menuIconShare" format="reference" />
</declare-styleable>

Unfortunately that just makes it even more confusing for me. What is this doing?


person FuegoFingers    schedule 21.09.2011    source источник


Ответы (6)


Значение ?attr/menuIconCamera означает, что будет использоваться иконка из атрибута menuIconCamera текущей темы.

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

Файл attrs.xml используется для определения пользовательских атрибутов. Без этого определения компилятор будет рассматривать неизвестные атрибуты как ошибочные.

person Michael    schedule 21.09.2011
comment
вы совершенно правы, ‹item name=menuIconCamera›@drawable/ic_menu_camera_holo_light‹/item›, большое спасибо. Я вижу, что ic_menu_camera_holo_light является локальным рисунком. Разве в 3.x нет встроенных общедоступных значков, как в 2.x? - person FuegoFingers; 21.09.2011
comment
Я не думаю, что это как-то связано с версией Android. Это просто способ сделать атрибуты зависимыми от выбранной темы. - person Michael; 21.09.2011

Синтаксис ?attr: используется для доступа к атрибутам текущей темы. См. ссылки на атрибуты стиля.

person Peter Knego    schedule 21.09.2011
comment
Предоставленная ссылка была очень, очень полезной. Спасибо! - person sven; 28.10.2011
comment
Очень полезно, но вы все равно должны опубликовать основные части этой ссылки. - person gustavohenke; 16.09.2015
comment
Это была самая полезная часть связанной статьи: «Ресурс атрибута стиля позволяет ссылаться на значение атрибута в применяемой в данный момент теме. Ссылка на атрибут стиля позволяет настраивать внешний вид элементов пользовательского интерфейса, стилизуя их в соответствии со стандартными вариантами, предоставляемыми текущей темой, вместо того, чтобы указывать жестко закодированное значение. Ссылка на атрибут стиля, по сути, означает использование стиля, определенного этим атрибутом, в текущей теме». - person bigtex777; 25.08.2016

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

Итак, с точки зрения непрофессионала,

someAttribute="?attr/attributeName" означает -

установите значение someAttribute равным значению attributeName в текущей теме

Типичный пример возникает при стилизации панели инструментов.

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary_color</item>
       //some more stuff here
</style>
<!-- custom toolbar style -->
<style name="myToolbar" parent="Widget.AppCompat.Toolbar">
      <item name="android:background">?attr/colorPrimary</item>
     //some code here
</style>

Здесь значение android:background будет установлено на @color/primary_color, потому что ?attr/colorPrimary ссылается на @color/primary_color в текущей теме (AppTheme).

person sziraqui    schedule 08.03.2017

Мой английский не очень хорош, извините. Но я знаю этот вопрос

android:icon="?attr/menuIconCamera" хочу использовать

attrs.xml

<resources>
    <declare-styleable name="AppTheme">
        <attr name="listDragShadowBackground" format="reference" />
        <attr name="menuIconCamera" format="reference" />
        <attr name="menuIconToggle" format="reference" />
        <attr name="menuIconShare" format="reference" />
    </declare-styleable>
</resources>

стили.xml

<style name="AppTheme.Light" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarStyle">@style/ActionBar.Light</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="listDragShadowBackground">@android:color/background_light</item>
        <item name="menuIconCamera">@drawable/ic_menu_camera_holo_light</item> //this....
        <item name="menuIconToggle">@drawable/ic_menu_toggle_holo_light</item>
        <item name="menuIconShare">@drawable/ic_menu_share_holo_light</item>
    </style>

использовать @drawable/ic_menu_camera_holo_light

person dawn    schedule 27.12.2011

Это для ссылки на атрибуты стиля. см. R.attr

?[<package_name>:][<resource_type>/]<resource_name>

Атрибуты стиля ссылок

person Michele    schedule 21.09.2011
comment
Одна вещь, которая, похоже, нигде не задокументирована, это то, что «‹package_name›» — это полное имя пакета того, что объявляет ресурс. Более конкретно, это не префикс пространства имен XML, хотя синтаксис может подсказывать это. Например, чтобы обратиться к атрибуту, объявленному библиотекой appcompat, используйте android.support.v7.appcompat:. - person Stop Harming the Community; 05.06.2014

В этом сообщении в блоге показано, как ссылаться на значения атрибутов стиля, которые определены в текущей теме: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • Когда вы видите обозначение ? — это означает, что мы пытаемся сослаться на атрибут стиля — значение, которое может варьироваться в зависимости от текущей темы. В каждой конкретной теме мы можем переопределить этот атрибут, поэтому макет XML не нужно менять, и необходимо применять правильную тему.

  • Когда вы видите обозначение @, мы ссылаемся на фактическое значение ресурса (цвет, строка, размер и т. д.). Этот ресурс должен иметь фактическую стоимость. В этом случае мы точно знаем, с каким значением имеем дело.

Вот пример:

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="LauncherButton" parent="TextAppearance.AppCompat.Medium">
        <item name="android:textColor">?colorAccent</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_centerHorizontal">true</item>
        <item name="android:textAllCaps">false</item>
    </style>
person nazmul idris    schedule 20.11.2018