Je regarde l'exemple de code Honeycomb Gallery ( ici ) et j'ai parcouru le code suivant en essayant d'ajouter des éléments d'action dans ma propre application:
<item android:id="@+id/camera"
android:title="Camera"
android:icon="?attr/menuIconCamera"
android:showAsAction="ifRoom" />
Le ?attr
me jette pour une boucle. Quelqu'un peut-il expliquer ce que cela fait? Comment cela est-il lié à un dessinable? Je n'arrive pas à trouver de bonnes informations sur Google. Existe-t-il également une liste ou une galerie d'attributs que nous pouvons utiliser pour les icônes au lieu de simplement menuIconCamera
?
Merci
Edit: J'ai fait un peu plus de recherche et j'ai trouvé que attrs.xml ressemblait à ceci:
<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>
Malheureusement, cela rend les choses encore plus déroutantes pour moi. Qu'est-ce que cela fait?
la source
La
?attr:
syntaxe est utilisée pour accéder aux attributs du thème actuel. Voir référencer les attributs de style .la source
Je sais que cet article est très ancien, mais je pense que l'explication suivante aidera les débutants à le comprendre facilement.
Donc, en termes simples,
someAttribute="?attr/attributeName"
veux dire -Un exemple courant se produit dans le style d'une barre d'outils
<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>
Ici, la valeur de
android:background
sera définie sur@color/primary_color
car?attr/colorPrimary
fait référence au@color/primary_color
thème actuel (AppTheme)la source
Mon anglais n'est pas bon, désolé. Mais je connais cette question
android:icon="?attr/menuIconCamera"
veux utiliserattrs.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>
utilisation
@drawable/ic_menu_camera_holo_light
la source
Ceci est pour référencer les attributs de style. voir R.attr
?[<package_name>:][<resource_type>/]<resource_name>
Référencer les attributs de style
la source
android.support.v7.appcompat:
.Cet article de blog fait un travail incroyable en expliquant comment référencer des valeurs pour les attributs de style qui sont définis dans le thème actuel: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/
Lorsque vous voyez une
?
notation - cela signifie que nous essayons de référencer un attribut de style - une valeur qui peut varier en fonction du thème actuel. Dans chaque thème spécifique, nous pouvons remplacer cet attribut, de sorte que la mise en page XML n'a pas besoin d'être modifiée et que le thème correct doit être appliqué.Lorsque vous voyez la
@
notation - nous référençons la valeur réelle de la ressource (couleur, chaîne, dimension, etc.). Cette ressource doit avoir une valeur réelle. Dans ce cas, nous savons exactement à quelle valeur nous avons affaire.Voici un exemple:
<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>
la source