Я смотрю пример кода 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>
К сожалению, это еще больше сбивает меня с толку. Что это делает?
источник
?attr:
Синтаксис используется для доступа к атрибутам текущей темы. См. Ссылку на атрибуты стиля .источник
Я знаю, что этот пост очень старый, но думаю, что следующее объяснение поможет новичкам легко его понять.
Итак, с точки зрения непрофессионала,
someAttribute="?attr/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)источник
У меня плохой английский, извините. Но я знаю этот вопрос
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
источник
Это относится к атрибутам стиля. см. R.attr
?[<package_name>:][<resource_type>/]<resource_name>
Ссылка на атрибуты стиля
источник
android.support.v7.appcompat:
.В этом сообщении блога замечательно рассказывается, как ссылаться на значения атрибутов стиля, которые определены в текущей теме: 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>
источник