Qualcuno può spiegare l'attr?


89

Sto guardando il codice di esempio di Honeycomb Gallery ( qui ) e mi sono imbattuto nel codice seguente mentre cercavo di aggiungere elementi di azione nella mia app:

<item android:id="@+id/camera"
    android:title="Camera"
    android:icon="?attr/menuIconCamera"
    android:showAsAction="ifRoom" />

Il ?attrmi sta gettando per un ciclo. Qualcuno può spiegare cosa sta facendo? Come è correlato a un disegnabile? Non riesco a trovare nessuna buona informazione su Google. Inoltre c'è un elenco o una galleria di attributi che possiamo usare per le icone invece che solo menuIconCamera?

Grazie

Modifica: ho guardato ancora un po 'intorno e ho scoperto che attrs.xml ha questo aspetto:

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

Sfortunatamente questo mi rende ancora più confuso. Cosa sta facendo?

Risposte:


64

Il ?attr/menuIconCameravalore significa che menuIconCameraverrà utilizzata un'icona dell'attributo del tema corrente.

Deve esserci un oggetto disegnabile assegnato menuIconCameraall'attributo da qualche parte nel themes.xmlfile. Se sono presenti due temi con valori diversi di questo attributo, l'icona effettiva dipenderà dal tema attualmente utilizzato.

Il attrs.xmlfile viene utilizzato per definire attributi personalizzati. Senza questa definizione, il compilatore tratterà gli attributi sconosciuti come errati.


1
hai esattamente ragione, <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </item>, grazie mille. Vedo che ic_menu_camera_holo_light è un disegnabile locale. 3.x non ha icone pubbliche integrate come quelle di 2.x?
FuegoFingers

Non credo sia in qualche modo collegato alla versione Android. Questo è solo un modo per rendere gli attributi dipendenti da un tema scelto.
Michael

51

La ?attr:sintassi viene utilizzata per accedere agli attributi del tema corrente. Vedere gli attributi di stile di riferimento .


3
Il link fornito è stato molto, molto utile. Grazie!
sven

3
Molto utile, ma dovresti comunque pubblicare le parti principali di quel link.
gustavohenke

1
Questa era la parte più utile dell'articolo collegato: "Una risorsa attributo di stile ti consente di fare riferimento al valore di un attributo nel tema attualmente applicato. Fare riferimento a un attributo di stile consente di personalizzare l'aspetto degli elementi dell'interfaccia utente definendoli in base alle variazioni standard fornite dal tema corrente, invece di fornire un valore hardcoded. Fare riferimento a un attributo di stile significa essenzialmente "usa lo stile definito da questo attributo, nel tema corrente". '
bigtex777

24

So che questo post è molto vecchio, ma credo che la seguente spiegazione aiuterà i principianti a capirlo facilmente.

Quindi in parole povere,

someAttribute="?attr/attributeName" si intende -

imposta il valore di someAttribute su qualunque sia il valore di attributeName nel tema corrente

Un esempio comune si verifica nello stile di una barra degli strumenti

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

Qui il valore di android:backgroundsarà impostato su @color/primary_colorperché ?attr/colorPrimaryfa riferimento al @color/primary_colortema corrente (AppTheme)


16

Il mio inglese non è buono, mi dispiace. Ma conosco questa domanda

android:icon="?attr/menuIconCamera" vuoi usare

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>

uso @drawable/ic_menu_camera_holo_light


4

Questo serve per fare riferimento agli attributi di stile. vedi R.attr

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

Riferimento agli attributi di stile


3
Una cosa che non sembra essere documentata da nessuna parte è che "<package_name>" è il nome completo del pacchetto di qualunque cosa abbia dichiarato la risorsa. Più specificamente, non è un prefisso dello spazio dei nomi XML, anche se la sintassi potrebbe suggerirlo. Ad esempio, per fare riferimento a un attr dichiarato dalla libreria appcompat, usa android.support.v7.appcompat:.
Smettila di danneggiare la comunità

4

Questo post del blog fa un lavoro straordinario esaminando come fare riferimento ai valori per gli attributi di stile definiti nel tema corrente: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • Quando vedi la ?notazione, significa che stiamo cercando di fare riferimento a un attributo di stile, un valore che può variare a seconda del tema corrente. In ogni tema specifico possiamo sovrascrivere questo attributo, quindi il layout XML non deve essere modificato e deve essere applicato il tema corretto.

  • Quando vedi la @notazione, facciamo riferimento al valore effettivo della risorsa (colore, stringa, dimensione, ecc.). Questa risorsa dovrebbe avere un valore effettivo. In questo caso sappiamo esattamente di quale valore abbiamo a che fare.

Ecco un esempio:

    <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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.