Ich muss meine eigenen Attribute wie in implementieren com.android.R.attr
In der offiziellen Dokumentation wurde nichts gefunden, daher benötige ich Informationen zum Definieren dieser Attribute und zur Verwendung in meinem Code.
android
android-resources
android-attributes
Alexander Oleynikov
quelle
quelle
Antworten:
Derzeit ist die beste Dokumentation die Quelle. Sie können es hier ansehen (attrs.xml) .
Sie können Attribute im obersten
<resources>
Element oder innerhalb eines<declare-styleable>
Elements definieren. Wenn ich ein attr an mehr als einer Stelle verwenden möchte, füge ich es in das Stammelement ein. Beachten Sie, dass alle Attribute denselben globalen Namespace verwenden. Das heißt, selbst wenn Sie ein neues Attribut innerhalb eines<declare-styleable>
Elements erstellen , kann es außerhalb des Elements verwendet werden, und Sie können kein anderes Attribut mit demselben Namen eines anderen Typs erstellen.Ein
<attr>
Element hat zwei XML-Attributename
undformat
.name
Sie können es etwas nennen, und so verweisen Sie im Code darauf, zR.attr.my_attribute
. Dasformat
Attribut kann je nach gewünschtem Attributtyp unterschiedliche Werte haben.Sie können das Format auf mehrere Typen einstellen, indem Sie
|
zformat="reference|color"
.enum
Attribute können wie folgt definiert werden:flag
Attribute sind ähnlich, außer dass die Werte definiert werden müssen, damit sie zusammengefügt werden können:Neben Attributen gibt es das
<declare-styleable>
Element. Auf diese Weise können Sie Attribute definieren, die eine benutzerdefinierte Ansicht verwenden kann. Sie tun dies, indem Sie ein<attr>
Element angebenformat
. Wenn es zuvor definiert wurde, geben Sie das nicht an . Wenn Sie ein Android-Attribut, beispielsweise Android: Gravity, wiederverwenden möchten, können Sie diesname
wie folgt tun .Ein Beispiel für eine benutzerdefinierte Ansicht
<declare-styleable>
:Wenn Sie Ihre benutzerdefinierten Attribute in XML in Ihrer benutzerdefinierten Ansicht definieren, müssen Sie einige Dinge tun. Zuerst müssen Sie einen Namespace deklarieren, um Ihre Attribute zu finden. Sie tun dies für das Root-Layout-Element. Normalerweise gibt es nur
xmlns:android="http://schemas.android.com/apk/res/android"
. Sie müssen jetzt auch hinzufügenxmlns:whatever="http://schemas.android.com/apk/res-auto"
.Beispiel:
Um auf dieses benutzerdefinierte Attribut zuzugreifen, tun Sie dies normalerweise im Konstruktor Ihrer benutzerdefinierten Ansicht wie folgt.
Das Ende. :) :)
quelle
View
: github.com/commonsguy/cw-advandroid/tree/master/Views/…xmlns:my="http://schemas.android.com/apk/lib/my.namespace"
- kein Kopieren von attrs.xml. Beachten Sie, dass der Namespace-URI-Pfad / apk / * lib * not / apk / res sein muss.apk/lib
Trick hat bei benutzerdefinierten Attributen mit Referenzformat aus einem Bibliotheksprojekt bei mir nicht funktioniert. Was tat der Arbeit Gebrauch warapk/res-auto
, wie in vorgeschlagen stackoverflow.com/a/13420366/22904 knapp unter und auch in stackoverflow.com/a/10217752enum
undflag
: Ersteres lässt uns einen und nur einen Wert auswählen, letzteres lässt uns mehrere kombinieren. Ich schrieb eine längere Antwort auf eine ähnliche Frage auf , hier und jetzt diese Frage gefunden zu haben , ich dachte ich , dass verknüpfen würde.a.recycle()
ist hier sehr wichtig, um SpeicherQberticus 'Antwort ist gut, aber ein nützliches Detail fehlt. Wenn Sie diese in einer Bibliothek implementieren, ersetzen Sie:
mit:
Andernfalls weist die Anwendung, die die Bibliothek verwendet, Laufzeitfehler auf.
quelle
Die obige Antwort deckt alles sehr detailliert ab, abgesehen von ein paar Dingen.
Wenn keine Stile vorhanden sind, wird zunächst die
(Context context, AttributeSet attrs)
Methodensignatur verwendet, um die Voreinstellung zu instanziieren. In diesem Fall verwenden Sie einfachcontext.obtainStyledAttributes(attrs, R.styleable.MyCustomView)
, um das TypedArray abzurufen.Zweitens wird nicht behandelt, wie mit plauralen Ressourcen (Mengenzeichenfolgen) umgegangen wird. Diese können mit TypedArray nicht behandelt werden. Hier ist ein Codeausschnitt aus meiner SeekBarPreference, der die Zusammenfassung der Präferenz festlegt und ihren Wert entsprechend dem Wert der Präferenz formatiert. Wenn die XML-Datei für die Voreinstellung android: summary auf eine Textzeichenfolge oder eine Zeichenfolge resouce setzt, wird der Wert der Voreinstellung in die Zeichenfolge formatiert (sie sollte% d enthalten, um den Wert abzurufen). Wenn android: summary auf eine plaurale Ressource festgelegt ist, wird dies zum Formatieren des Ergebnisses verwendet.
notifyChanged()
dieonDialogClosed
Methode der Voreinstellung aufrufen .quelle
Der traditionelle Ansatz ist voll von Boilerplate-Code und ungeschicktem Umgang mit Ressourcen. Deshalb habe ich das Spyglass-Framework erstellt . In diesem Beispiel wird gezeigt, wie eine benutzerdefinierte Ansicht erstellt wird, in der ein Zeichenfolgentitel angezeigt wird.
Schritt 1: Erstellen Sie eine benutzerdefinierte Ansichtsklasse.
Schritt 2: Definieren Sie ein Zeichenfolgenattribut in der
values/attrs.xml
Ressourcendatei:Schritt 3: Wenden Sie die
@StringHandler
Anmerkung auf diesetTitle
Methode an, um das Spyglass-Framework anzuweisen, den Attributwert an diese Methode weiterzuleiten, wenn die Ansicht aufgeblasen wird.Nachdem Ihre Klasse über eine Spyglass-Annotation verfügt, erkennt das Spyglass-Framework diese zur Kompilierungszeit und generiert die
CustomView_SpyglassCompanion
Klasse automatisch .Schritt 4: Verwenden Sie die generierte Klasse in der
init
Methode der benutzerdefinierten Ansicht :Das ist es. Wenn Sie nun die Klasse aus XML instanziieren, interpretiert der Spyglass-Begleiter die Attribute und führt den erforderlichen Methodenaufruf aus. Wenn wir beispielsweise das folgende Layout aufblasen,
setTitle
wird dies"Hello, World!"
als Argument aufgerufen .Das Framework ist nicht auf Zeichenfolgenressourcen beschränkt und verfügt über viele verschiedene Anmerkungen für die Verarbeitung anderer Ressourcentypen. Es enthält auch Anmerkungen zum Definieren von Standardwerten und zum Übergeben von Platzhalterwerten, wenn Ihre Methoden mehrere Parameter haben.
Weitere Informationen und Beispiele finden Sie im Github-Repo.
quelle
android:title="@{"Hello, world!"}"
.Wenn Sie das
format
Attribut imattr
Element weglassen , können Sie damit auf eine Klasse aus XML-Layouts verweisen.Refactor > Rename
funktioniertFind Usages
funktioniertGeben Sie kein
format
Attribut in ... / src / main / res / values / attrs.xml anVerwenden Sie es in einer Layoutdatei ... / src / main / res / layout / activity__main_menu.xml
Analysieren Sie die Klasse in Ihrem Ansichtsinitialisierungscode ... / src / main / java /.../ MyCustomView.kt
quelle