web-dev-qa-db-fra.com

Quelqu'un peut-il expliquer l'attr?

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?

77
FuegoFingers

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.

54
Michael

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

46
Peter Knego

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)

17
sziraqui

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

14
dawn

C'est pour faire référence aux attributs de style. voir R.attr

?[<package_name>:][<resource_type>/]<resource_name>

Attributs de style de référencement

4
Michele

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>
0
nazmul idris