Kann jemand das attr erklären?

88

Ich schaue mir den Beispielcode der Honeycomb Gallery ( hier ) an und bin beim Versuch, Aktionselemente in meiner eigenen App hinzuzufügen, auf den folgenden Code gestoßen:

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

Das ?attrwirft mich für eine Schleife. Kann jemand bitte erklären, was das tut? Wie hängt das mit einem Drawable zusammen? Ich kann anscheinend keine guten Informationen bei Google finden. Gibt es auch eine Liste oder Galerie von Attributen, die wir für Symbole verwenden können, anstatt nur menuIconCamera?

Vielen Dank

Bearbeiten: Ich habe mich noch ein bisschen umgesehen und festgestellt, dass attrs.xml so aussieht:

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

Leider macht es das für mich nur noch verwirrender. Was macht das?

FuegoFingers
quelle

Antworten:

63

Der ?attr/menuIconCameraWert bedeutet, dass ein Symbol aus dem menuIconCameraAttribut des aktuellen Themas verwendet wird.

Dem menuIconCameraAttribut muss irgendwo in der themes.xmlDatei ein Zeichenelement zugewiesen sein . Wenn es zwei Themen mit unterschiedlichen Werten für dieses Attribut gibt, hängt das tatsächliche Symbol von einem aktuell verwendeten Thema ab.

Die attrs.xmlDatei wird verwendet, um benutzerdefinierte Attribute zu definieren. Ohne diese Definition behandelt der Compiler unbekannte Attribute als fehlerhaft.

Michael
quelle
1
Sie sind genau richtig, <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </ item>, vielen Dank. Ich sehe, dass ic_menu_camera_holo_light ein lokales Drawable ist. Hat 3.x keine öffentlichen Symbole eingebaut wie 2.x?
FuegoFingers
Ich glaube nicht, dass es irgendwie mit der Android-Version verbunden ist. Dies ist nur eine Möglichkeit, Attribute von einem ausgewählten Thema abhängig zu machen.
Michael
50

Die ?attr:Syntax wird für den Zugriff auf Attribute des aktuellen Themas verwendet. Siehe Referenzieren von Stilattributen .

Peter Knego
quelle
3
Der mitgelieferte Link war sehr, sehr hilfreich. Vielen Dank!
Sven
3
Sehr hilfreich, aber Sie sollten trotzdem die Hauptteile dieses Links posten.
Gustavohenke
1
Dies war der hilfreichste Teil des verknüpften Artikels: 'Mit einer Stilattributressource können Sie auf den Wert eines Attributs im aktuell angewendeten Thema verweisen. Durch Verweisen auf ein Stilattribut können Sie das Aussehen von UI-Elementen anpassen, indem Sie sie so gestalten, dass sie den vom aktuellen Thema bereitgestellten Standardvarianten entsprechen, anstatt einen fest codierten Wert anzugeben.
Wenn Sie auf ein Stilattribut verweisen
23

Ich weiß, dass dieser Beitrag sehr alt ist, aber ich denke, die folgende Erklärung wird Anfängern helfen, ihn leicht zu verstehen.

Also in Laienbegriffen,

someAttribute="?attr/attributeName" meint -

Setzen Sie den Wert von someAttribute auf den Wert von attributeName im aktuellen Thema

Ein häufiges Beispiel ist das Stylen einer Symbolleiste

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

Hier Wert android:backgroundwird festgelegt werden , @color/primary_colorda ?attr/colorPrimarybezieht sich auf @color/primary_colorim aktuellen Thema (AppTheme)

sziraqui
quelle
16

Mein Englisch ist nicht gut, sorry. Aber ich kenne diese Frage

android:icon="?attr/menuIconCamera" will verwenden

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>

verwenden @drawable/ic_menu_camera_holo_light

Dämmerung
quelle
4

Dies dient zum Verweisen auf Stilattribute. siehe R.attr

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

Referenzieren von Stilattributen

Michele
quelle
3
Eine Sache, die nirgendwo dokumentiert zu sein scheint, ist, dass '<Paketname>' der vollständige Paketname dessen ist, was die Ressource deklariert hat. Insbesondere handelt es sich nicht um ein XML-Namespace-Präfix, obwohl die Syntax dies möglicherweise nahelegt. Verwenden Sie beispielsweise, um auf ein von der appcompat-Bibliothek deklariertes attr zu verweisen android.support.v7.appcompat:.
Hören Sie auf, der Gemeinschaft am
4

Dieser Blog-Beitrag leistet hervorragende Arbeit bei der Referenzierung von Werten für Stilattribute, die im aktuellen Thema definiert sind: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • Wenn Sie die ?Notation sehen, bedeutet dies, dass wir versuchen, auf ein Stilattribut zu verweisen. Dieser Wert kann je nach aktuellem Thema variieren. In jedem bestimmten Thema können wir dieses Attribut überschreiben, sodass das XML-Layout nicht geändert werden muss und das richtige Thema angewendet werden muss.

  • Wenn Sie die @Notation sehen, verweisen wir auf den tatsächlichen Ressourcenwert (Farbe, Zeichenfolge, Dimension usw.). Diese Ressource sollte einen tatsächlichen Wert haben. In diesem Fall wissen wir genau, mit welchem ​​Wert wir es zu tun haben.

Hier ist ein Beispiel:

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