Может кто-нибудь объяснить 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>
К сожалению, это просто делает меня еще более запутанным для меня. Что это значит?
Ответы
Ответ 1
Значение ?attr/menuIconCamera
означает, что будет использоваться значок из атрибута menuIconCamera
текущей темы.
Для атрибута menuIconCamera
где-то в файле themes.xml
должен быть присвоен атрибут drawable. Если есть две темы с разными значениями этого атрибута, то фактический значок будет зависеть от темы, которая в настоящее время используется.
Файл attrs.xml
используется для определения настраиваемых атрибутов. Без этого определения компилятор будет рассматривать неизвестные атрибуты как ошибочные.
Ответ 2
Синтаксис ?attr:
используется для доступа к атрибутам текущей темы. См. ссылки на атрибуты стиля.
Ответ 3
Мой английский плохой, извините. Но я знаю этот вопрос
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
Я знаю, что этот пост очень старый, но я чувствую, что следующее объяснение поможет начинающим легко понять это.
Итак, в непрофессиональных терминах
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)
Ответ 5
Это относится к атрибутам стиля. см. R.attr
?[<package_name>:][<resource_type>/]<resource_name>
Ссылка на атрибуты стиля