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.
selector
Arbeiten mit Drawables zu beginnen. Nachdem ich dies gelesen hatte, benutzte ich Style Attribute Docs , um die restlichen Teile auszufüllen.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.In diesem Fall
?
bedeutet das, ein Thema im Paket zu betrachten,android
und es ist vom Typ,attr
in dem der Name stehtactivatedBackgroundIndicator
.Sie sollten auch im CodeBehind mit darauf zugreifen können
android.R.attr.activatedBackgroundIndicator
.Eine Liste der Android-
attr
Eigenschaften finden Sie unter R.attractivatedBackgroundIndicator
ist ein definiertes Drawable in Android 3.0+ alsEs 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
quelle
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:
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
LocationManager
Klasse, 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.quelle
Update: Es gibt eine detailliertere Version im API-Handbuch, daher möchte ich sie zitieren.
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
quelle