Je regarde l'exemple de code de la galerie Honeycomb ( ici ) et j'ai rencontré 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 lance pour une boucle. Quelqu'un peut-il s'il vous plaît expliquer ce que cela fait? Comment est-ce lié à un drawable? Je n'arrive pas à trouver de bonnes informations sur Google. De plus, existe-t-il 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 quelques recherches supplémentaires et constaté que attrs.xml ressemble à 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 me rend encore plus déroutant. Qu'est-ce que cela fait?
La valeur ?attr/menuIconCamera
signifie qu'une icône de l'attribut menuIconCamera
du thème actuel sera utilisée.
Un attribut dessinable doit être affecté à l'attribut menuIconCamera
quelque part dans le fichier themes.xml
. S'il y a deux thèmes avec des valeurs différentes pour cet attribut, l'icône réelle dépendra du thème actuellement utilisé.
Le fichier attrs.xml
permet de définir des attributs personnalisés. Sans cette définition, le compilateur traitera les attributs inconnus comme étant erronés.
La syntaxe ?attr:
est utilisée pour accéder aux attributs du thème actuel. Voir Attributs de style de référencement .
Je sais que ce message est très ancien, mais j’ai le sentiment que l’explication suivante aidera les débutants à le comprendre facilement.
Donc, en termes simples,
someAttribute="?attr/attributeName"
signifie -
définissez la valeur de someAttribute sur la valeur de nomAttribut dans le thème actuel
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 à @color/primary_color
dans le thème actuel (AppTheme)
Mon anglais n'est pas bon, désolé. Mais je connais cette question
Android:icon="?attr/menuIconCamera"
veut utiliser
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>
utiliser @drawable/ic_menu_camera_holo_light
C'est pour faire référence aux attributs de style. voir R.attr
?[<package_name>:][<resource_type>/]<resource_name>
Ce billet de blog fait un travail incroyable en expliquant comment référencer des valeurs pour les attributs de style définis dans le thème actuel: https://trickyandroid.com/Android-resources-and-style-attributes-cheatsheet) /
Lorsque vous voyez la 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. Par conséquent, il n'est pas nécessaire de modifier la présentation XML, et le thème approprié doit être appliqué.
Lorsque vous voyez la notation @
, nous référons à 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 traitons.
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>