Quelqu'un peut-il expliquer l'attr?

89

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

FuegoDoigts
la source

Réponses:

64

La ?attr/menuIconCameravaleur signifie qu'une icône de l' menuIconCameraattribut du thème actuel sera utilisée.

Il doit y avoir un dessinable affecté à l' menuIconCameraattribut quelque part dans le themes.xmlfichier. S'il y a deux thèmes avec des valeurs différentes de cet attribut, l'icône réelle dépendra d'un thème actuellement utilisé.

Le attrs.xmlfichier est utilisé pour définir des attributs personnalisés. Sans cette définition, le compilateur traitera les attributs inconnus comme erronés.

Michael
la source
1
vous avez exactement raison, <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </item>, merci beaucoup. Je vois que ic_menu_camera_holo_light est un dessin local. 3.x n'a-t-il pas d'icônes publiques intégrées comme 2.x?
FuegoFingers
Je ne pense pas que ce soit connecté à la version Android. C'est juste une façon de rendre les attributs dépendants d'un thème choisi.
Michael le
51

La ?attr:syntaxe est utilisée pour accéder aux attributs du thème actuel. Voir référencer les attributs de style .

Peter Knego
la source
3
Le lien fourni était très, très utile. Merci!
sven
3
Très utile, mais vous devriez quand même publier les principales parties de ce lien.
gustavohenke
1
C'était la partie la plus utile de l'article lié: «Une ressource d'attribut de style vous permet de référencer la valeur d'un attribut dans le thème actuellement appliqué. Le référencement d'un attribut de style vous permet de personnaliser l'apparence des éléments de l'interface utilisateur en les stylisant pour qu'ils correspondent aux variations standard fournies par le thème actuel, au lieu de fournir une valeur codée en dur. Faire référence à un attribut de style signifie essentiellement: "utilisez le style qui est défini par cet attribut, dans le thème actuel." '
bigtex777
24

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 -

définir la valeur de someAttribute sur quelle que soit la valeur de attributeName 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:backgroundsera définie sur @color/primary_colorcar ?attr/colorPrimaryfait référence au @color/primary_colorthème actuel (AppTheme)

sziraqui
la source
16

Mon anglais n'est pas bon, désolé. Mais je connais cette question

android:icon="?attr/menuIconCamera" veux 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>

utilisation @drawable/ic_menu_camera_holo_light

Aube
la source
4

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

Michele
la source
3
Une chose qui ne semble être documentée nulle part est que «<package_name>» est le nom complet du package de tout ce qui a déclaré la ressource. Plus spécifiquement, ce n'est pas un préfixe d'espace de noms XML, même si la syntaxe pourrait le suggérer. Par exemple, pour faire référence à un attr déclaré par la bibliothèque appcompat, utilisez android.support.v7.appcompat:.
Arrêtez de nuire à la communauté
4

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>
Nazmul Idris
la source