wake-up-neo.net

Kann jemand das Attr erklären?

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

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

Der ?attr wirft mich für eine Schleife. Kann jemand bitte erklären, was das macht? Wie hängt das mit einer Zeichnung zusammen? Ich kann anscheinend keine guten Informationen bei Google finden. Gibt es auch eine Liste oder eine Galerie von Attributen, die wir anstelle von menuIconCamera für Symbole verwenden können?

Vielen Dank

Edit: Ich habe mich etwas 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 das nur noch verwirrender für mich. Was macht das?

77
FuegoFingers

Der ?attr/menuIconCamera-Wert bedeutet, dass ein Symbol des menuIconCamera-Attributs des aktuellen Designs verwendet wird.

Dem menuIconCamera-Attribut muss irgendwo in der themes.xml-Datei ein Zeichen zugeordnet sein. Wenn zwei Themen mit unterschiedlichen Werten für dieses Attribut vorhanden sind, hängt das tatsächliche Symbol von einem aktuell verwendeten Thema ab.

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

54
Michael

Die ?attr:-Syntax wird für den Zugriff auf Attribute des aktuellen Designs verwendet. Siehe Verweise auf Stilattribute .

46
Peter Knego

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

Also in Laien ausgedrückt,

someAttribute="?attr/attributeName" bedeutet -

setzen Sie den Wert von someAttribute auf den Wert von attributeName im aktuellen Design

Ein allgemeines Beispiel tritt beim Gestalten einer Symbolleiste auf

<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 wird der Wert von Android:background auf @color/primary_color gesetzt, da ?attr/colorPrimary im aktuellen Design auf @color/primary_color verweist (AppTheme).

17
sziraqui

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

Android:icon="?attr/menuIconCamera" möchte verwendet werden 

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 Sie @drawable/ic_menu_camera_holo_light

14
dawn

Dies dient zum Verweisen von Stilattributen. siehe R.attr

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

Stilattribute referenzieren

4
Michele

In diesem Blog-Post wird eine erstaunliche Arbeit geleistet, wie Sie Werte für Stilattribute referenzieren können, die im aktuellen Thema definiert sind: https://trickyandroid.com/Android-resources-and-style-attributes-cheatsheet/

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

  • Wenn Sie die @-Notation sehen, referenzieren wir den tatsächlichen Ressourcenwert (Farbe, Zeichenfolge, Dimension, Usw.). Diese Ressource sollte einen tatsächlichen Wert haben. In diesem Fall wissen wir genau, welchen Wert wir 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>
0
nazmul idris