Может кто-нибудь объяснить attr? - PullRequest
82 голосов
/ 21 сентября 2011

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

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

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

К сожалению, это только делает меня еще более запутанным.Что это делает?

Ответы [ 6 ]

60 голосов
/ 21 сентября 2011

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

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

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

48 голосов
/ 21 сентября 2011

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

20 голосов
/ 08 марта 2017

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

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

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)

15 голосов
/ 27 декабря 2011

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

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>

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

4 голосов
/ 21 сентября 2011

Это для атрибутов стиля refering.см. R.attr

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

Ссылка на атрибуты стиля

2 голосов
/ 21 ноября 2018

Этот пост блога проделывает потрясающую работу, рассказывая, как ссылаться на значения для атрибутов стиля, которые определены в текущей теме: 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>
...