Ich schreibe einige benutzerdefinierte Ansichten, die einige gleichnamige Attribute aufweisen. In ihrem jeweiligen <declare-styleable>
Abschnitt in attrs.xml
möchte ich die gleichen Namen für Attribute verwenden:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView1">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
<declare-styleable name="MyView2">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
</resources>
Ich erhalte eine Fehlermeldung myattr1
und bin myattr2
bereits definiert. Ich habe festgestellt, dass ich das format
Attribut für myattr1
und myattr2
in weglassen sollte MyView2
, aber wenn ich das tue, erhalte ich den folgenden Fehler in der Konsole:
[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute
Gibt es eine Möglichkeit, dies zu erreichen, vielleicht eine Art Namensraum (nur Vermutung)?
myattr1
String inMyView1
und Integer in istMyView2
?ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr
für alle Ansichten, für die ich mich zu erklären versuche. Irgendwelche Ideen?<attr name="myattr1" format="string|integer" />
. Funktioniert bei mir.Ich poste diese Antwort, da die oben veröffentlichte Lösung in Android Studio für mich nicht funktioniert hat. Ich muss meine benutzerdefinierten Attribute für meine benutzerdefinierten Ansichten freigeben, damit ich die oben genannte Lösung in Android Studio ausprobiert habe, aber kein Glück hatte. Also experimentiere ich und gehe einen Weg, es zu tun. Hoffe, es könnte jemandem helfen, der nach dem gleichen Problem sucht.
Das funktioniert bei mir komplett. Wir müssen einen Elternteil stilisierbar machen und dann diesen Elternteil stilisierbar erben. Zum Beispiel, wie ich oben getan habe: Übergeordneter stilbarer Name MyView und erbte diesen an meinen anderen stilbaren Namen wie MyView1 bzw. MyView2.
quelle
MyView2
rechts:R.styleable.MyView2_myattr1
, falsch:R.styleable.MyView_myattr1
)Wie Priya Singhal antwortete, müssen für Android Studio die allgemeinen Attributnamen in ihrem eigenen Stilnamen definiert werden. Sie können nicht mehr an der Wurzel sein.
Es gibt jedoch noch ein paar andere Dinge zu beachten (weshalb ich auch eine Antwort hinzufüge):
Beispiel
Folgendes habe ich kürzlich in einem Projekt mit zwei benutzerdefinierten Ansichten getan, die beide dieselben Attribute aufweisen. Solange die benutzerdefinierten Ansichten noch die Namen für die Attribute haben und keine enthalten
format
, kann ich weiterhin wie gewohnt über Code darauf zugreifen.Optimiertes Beispiel
Tatsächlich muss ich die Attribute nicht einmal unter einen benutzerdefinierten Namen setzen. Solange ich sie
format
für mindestens eine benutzerdefinierte Ansicht definiere (geben Sie ihnen ein ), kann ich sie überall verwenden (ohne dieformat
). Das funktioniert also auch (und sieht sauberer aus):Bei einem großen Projekt kann dies jedoch unübersichtlich werden, und es ist möglicherweise besser, sie oben an einem einzigen Ort zu definieren (wie hier empfohlen ).
quelle
parent
Attribut explizit machen, habe aber nicht viele Beiträge gesehen, die auf seine Verwendung hinweisen.parent
. Ich glaube, ich habe nur gesagt, dass es nicht erforderlich ist.Vielen Dank, Lewis, ich hatte das gleiche Problem, und Ihre Vererbungslösung gab mir den Hinweis, es wie unten zu tun, und es funktioniert einwandfrei. Ich habe oben nur allgemeine Attribute deklariert und es ohne Formatierung erneut in den Textkörper der Stildeklaration geschrieben. Ich hoffe es hilft jemandem
quelle
Nur für den Fall, dass jemand nach dem Versuch einer verfügbaren Lösung immer noch an diesem Problem festhält. Ich blieb beim Hinzufügen eines
subtitle
Attributs mitstring
Format.Meine Lösung ist das Entfernen des Formats.
Vor:
<attr name="subtitle" format="string"/>
nach dem:
<attr name="subtitle"/>
quelle