Wie funktioniert "? Android: attr / enabledBackgroundIndicator"?

84

Ich habe nach Möglichkeiten gesucht, ein ausgewähltes Element in einer Liste hervorzuheben, wenn eine kontextbezogene Aktionsleiste für die Auswahl android:backgroundangezeigt wird "?android:attr/activatedBackgroundIndicator". Die Lösung bestand darin, das Attribut meiner Zeilenlayout-XML auf festzulegen .

Wie funktioniert das Einstellen?

  1. Was ist der Mechanismus?
  2. Was bedeuten die Syntaxelemente wie "?", "attr", "enabledBackgroundIndicator"?
  3. Wo ist die Bedeutung von "enabledBackgroundIndicator" definiert?
jrharshath
quelle

Antworten:

220

Wenn Sie in einer forensischen Stimmung sind, erfahren Sie hier, wie Sie graben und herausfinden, was los ist.

android:background="?android:attr/activatedBackgroundIndicator"?

Intuitiv bedeutet dies, den Hintergrund auf ein Zeichen zu setzen.

Aber lassen Sie uns dies weiter zerlegen, um zu sehen, wie wir zu unserem mysteriösen Zeichen gelangen.

Um genau zu sein, bedeutet dies "Setzen Sie das Hintergrundattribut auf das, worauf sich das Attribut" enabledBackgroundIndicator " im aktuellen Thema bezieht .

Wenn Sie den Teil "bezieht sich auf das aktuelle Thema" verstehen, haben Sie im Grunde alles verstanden, was sich hinter den Deckblättern abspielt.

Grundsätzlich ist enabledBackgroundIndicator kein tatsächliches Drawable, sondern ein Verweis auf ein Drawable . Wo also ist das Attribut "activBackgroundIndictor" tatsächlich definiert?

Es ist in Ihrem SDK-Verzeichnis in einem Dateinamen attrs.xml definiert . Beispielsweise:

path_to_android_sdk / platform / android-17 / data / res / values ​​/ attrs.xml

Wenn Sie diese Datei öffnen, erhalten Sie die Erklärung wie folgt:

<attr name="activatedBackgroundIndicator" format="reference" />

In attrs.xml deklarieren Sie alle Attribute, die Sie später in Ihrer View-XML verwenden werden. Beachten Sie, dass wir das Attribut und seinen Typ deklarieren und hier keinen Wert zuweisen .

Der tatsächliche Wert wird in der Datei theme.xml zugewiesen . Diese Datei befindet sich unter:

path_to_android_sdk / platform / android-17 / data / res / values ​​/ theme.xml

Wenn Sie diese Datei öffnen, werden die verschiedenen Definitionen angezeigt, je nachdem, welches Thema Sie verwenden . Hier sind beispielsweise die Definitionen für die Themennamen Theme, Theme.Light, Theme.Holo, Theme.Holo.Light:

<item name="activatedBackgroundIndicator">@android:drawable/activated_background</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item>

Jetzt haben wir unsere mysteriösen Drawables. Wenn Sie den ersten auswählen, wird dieser im Zeichenordner unter folgender Adresse definiert:

path_to_android_sdk / platform / android-17 / data / res / drawable / enabled_background.xml

Wenn Sie diese Datei öffnen, sehen Sie die Definition des Zeichens, die wichtig ist, um zu verstehen, was vor sich geht.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" />
    <item android:drawable="@color/transparent" />
</selector>

Hier definieren wir ein Drawable mit zwei Status - der Standardstatus ist nur ein transparenter Hintergrund, und wenn der Status "state_activated" ist, lautet unser Drawable "list_selector_background_selected".

Unter diesem Link finden Sie Hintergrundinformationen zu Zeichen und Zuständen.

"list_selector_background_selected" ist eine 9-Patch-PNG-Datei, die sich im Ordner drawable-hdpi befindet.

Jetzt können Sie sehen, warum wir activatedBackgroundIndicator als Referenz definiert haben, anstatt direkt mit der Zeichnungsdatei zu verknüpfen. So können Sie je nach Thema die richtige Zeichnungsdatei auswählen.

numan salati
quelle
3
Eine Antwort, um sie alle zu regieren. Wenn man also ein XML mit denselben Selektoren erstellen würde, könnte man seinen eigenen "enabledBackgroundIndicator" erstellen?
Gee.E
1
genau - Sie können es in Ihrem benutzerdefinierten theme.xml neu definieren. b / c ist ein Referenzattribut.
Numan Salati
Diese Antwort half mir herauszufinden, wie ich ein benutzerdefiniertes Zeichen für mein Listenelement in der Navigationsleiste festlegen kann.
Tastybrownies
Dies ist eine großartige Ressource, um mit der Arbeit an benutzerdefinierten selectorArbeiten mit Drawables zu beginnen. Nachdem ich dies gelesen hatte, benutzte ich Style Attribute Docs , um die restlichen Teile auszufüllen.
Maurizio
1
Können Sie ein Beispiel dafür geben, wie diese Hintergrundanzeige überschrieben werden kann? Meins funktioniert nicht: / <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: enabledBackgroundIndicator"> @ drawable / enabled_background </ item> </ style> enabled_background.xml : <Selektor xmlns: android = " schemas.android.com/apk/res/android "> <item android: state_activated = "true" android: drawable = "@ color / gelb" /> <item android: drawable = "@ android: color / transparent "/> </ selector>
vandus
13

Ich habe mich das auch einmal gefragt. Ein großer Teil der Android-Ressourcen scheint wie eine Blackbox zu sein und kann sie nicht direkt sehen. Möglicherweise fehlen sie irgendwo, aber ich kann sie nicht im SDK-Quellcode finden. Folgendes weiß ich.

  • android:background wird ein Drawable nehmen.
  • Die Syntax ist im Stil

    Muss ein Verweis auf eine andere Ressource in der Form "@ [+] [Paket:] Typ: Name" oder auf ein Themenattribut in der Form "? [Paket:] [Typ:] Name" sein.

In diesem Fall ?bedeutet das, ein Thema im Paket zu betrachten, androidund es ist vom Typ, attrin dem der Name steht activatedBackgroundIndicator.

Sie sollten auch im CodeBehind mit darauf zugreifen können android.R.attr.activatedBackgroundIndicator.

Eine Liste der Android- attrEigenschaften finden Sie unter R.attr

  • activatedBackgroundIndicator ist ein definiertes Drawable in Android 3.0+ als

    Zeichenbar als Hintergrund für aktivierte Elemente.

Es ist im Grunde nur ein Standardelement, das im Betriebssystem definiert ist. Ich kann nicht in der Android-Quelle finden, aber hier ist ein Link zur Dokumentation. enabledBackgroundIndicator

Kirche
quelle
5

Dies ist eine Form des Anhängens eines Werts aus einem Thema. Der Wert ist während der Ressourcenkompilierung technisch nicht bekannt, da die Themenwerte zu diesem Zeitpunkt möglicherweise nicht bekannt sind. Stattdessen wird der Wert zur Laufzeit basierend auf dem tatsächlichen Thema aufgelöst, aus dem (am häufigsten) entnommen wurde ContextThemeWrapper.

Dies bietet eine Möglichkeit, Ressourcenwerte wiederzuverwenden. Ich spreche hier nicht von Leistung, sondern von Organisation und Wartung. Das Attribut fungiert sozusagen als Variable mit dem Versprechen, dass es zur Laufzeit einen tatsächlichen Wert enthält.

Dieser Ansatz ermöglicht auch eine größere Anpassung - anstatt den Wert von z. B. Fensterhintergrund, der gezeichnet werden kann, fest zu codieren, wird der tatsächliche Zeichnungswert aus einem Thema abgerufen, wobei ein ausgewähltes Attribut als Schlüssel angegeben wird. Auf diese Weise können Sie den Wert für dieses Attribut überschreiben. Sie müssen einfach:

  1. Erstellen Sie Ihr eigenes Thema (dies ist nur ein ausgefallener Name für eine "Stil" -Ressource), der am häufigsten von einem der Standardthemen abgeleitet wird.
  2. Geben Sie Ihren eigenen Wert für das betreffende Attribut an.

Die Plattform verwendet Ihren Wert automatisch, sofern Sie Ihr Thema für eine Aktivität oder Anwendung angegeben haben. Sie tun dies wie in der Frage beschrieben. Die allgemeine Syntax von Themenattributreferenzen wird hier beschrieben: Referenzieren von Stilattributen . Dort finden Sie auch ein Beispiel und eine Beschreibung des gesamten Mechanismus.

Bearbeiten

Eine Sache, die beachtet werden sollte, sind die tatsächlichen Attributnamen und ihre Existenz in verschiedenen Plattformversionen. Es ist ziemlich üblich, dass in den nächsten Plattformversionen neue Attribute eingeführt werden - zum Beispiel wurden einige in Version 3.0 zum Zweck des ActionBar-Stils hinzugefügt.

Sie sollten Attributnamen als Teil der API behandeln - mit anderen Worten, sie sind Teil des Vertrags, den Sie verwenden dürfen. Dies ist den Klassen und ihren Signaturen sehr ähnlich. Sie verwenden die LocationManagerKlasse, um den letzten Gerätestandort zu ermitteln, da Sie aus einer Quelle (Tutorials, Referenzen, offizielle Anleitungen usw.) wissen , wozu diese Klasse dient. Ebenso werden die Attributnamen und ihr Zweck (manchmal gut, manchmal miserabel) in der Android Platform-Dokumentation definiert.

andr
quelle
2

Update: Es gibt eine detailliertere Version im API-Handbuch, daher möchte ich sie zitieren.

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 Erscheinungsbild von Benutzeroberflächenelementen 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, heißt es im Wesentlichen: "Verwenden Sie den durch dieses Attribut definierten Stil im aktuellen Thema."

Um auf ein Stilattribut zu verweisen, ist die Namenssyntax fast identisch mit dem normalen Ressourcenformat. Verwenden Sie jedoch anstelle des at-Symbols (@) ein Fragezeichen (?), Und der Ressourcentypteil ist optional. Zum Beispiel: `

Ursprüngliche Antwort:

numan salati bot bereits eine perfekte Antwort an, hat aber das "?" Syntax. Hier ist ein Zitat aus dem API-Handbuch Zugriff auf Ressourcen

Um auf ein Stilattribut zu verweisen, ist die Namenssyntax fast identisch mit dem normalen Ressourcenformat. Verwenden Sie jedoch anstelle des at-Symbols (@) ein Fragezeichen (?), Und der Ressourcentypteil ist optional. Zum Beispiel:

? [<Paketname>:] [<Ressourcentyp> /] <Ressourcenname>

Teng-pao Yu
quelle