Ich habe ein benutzerdefiniertes Widget erstellt und deklariere es in layout.xml. Ich habe auch einige benutzerdefinierte Attribute in attr.xml hinzugefügt. Wenn ich jedoch versuche, diese Attribute in einem Stil in styles.xml zu deklarieren, gibt es mirNo resource found that matches the given name: attr 'custom:attribute'.
Ich habe das xmlns:custom="http://schemas.android.com/apk/res/com.my.package"
in alle Tags in styles.xml eingefügt, einschließlich <?xml>
, <resources>
und <style>
, aber es gibt mir immer noch den gleichen Fehler, dass mein benutzerdefinierter XML-Namespace nicht gefunden werden kann.
Ich kann jedoch meinen Namespace verwenden, um der Ansicht in meiner layout.xml manuell Attribute zuzuweisen, sodass am Namespace nichts falsch ist. Mein Problem besteht darin, styles.xml auf meine attr.xml aufmerksam zu machen.
quelle
cutsom:xmlns=...
?? sollte nicht seinxmlns:cutsom=...
?Antworten:
Ich habe es herausgefunden! Die Antwort lautet , den Namespace NICHT im Stil anzugeben.
quelle
declare-stylable
anstelle einer Aufzählung verwendet. Ich bin mir nicht sicher, warum Aufzählungen nicht funktionierten, aber diese Umgehung war gut genug für mich.Die obige Antwort funktioniert für mich. Ich habe eine kleine Änderung versucht. Ich erkläre sie für eine Klasse im Ressourcenelement als stilbar.
In declare-styleable hat das name- Attribut auf einen Klassennamen verwiesen, sodass ich einen View-Klassenaufruf "com.my.package.name.VerticalView" hatte. Es stellte dar, dass diese Deklaration in VerticalView oder Unterklassen von VerticalView verwendet werden muss. so können wir Stil wie folgt deklarieren:
Aus diesem Grund haben wir den Namespace im Ressourcenelement nicht deklariert, es funktioniert immer noch.
quelle
values / styles.xml
values / attrs.xml
Werte / Farben.xml
values / dimension.xml
Verwenden von
DEMO
quelle
Die Modifikation von Styler und Vince hat bei mir funktioniert. Ich wollte darauf hinweisen, dass die Erklärung von @ vince möglicherweise nicht ganz richtig ist.
Um die Hypothese zu testen, dass das Namensattribut der
declare-styleable
Übereinstimmung mit dem Namen der benutzerdefinierten Ansichtsklasse den Zugriff auf das benutzerdefinierte Attribut ohne einen Namespace ermöglicht, habe ich den Namen der geändertdeclare-styleable
(die benutzerdefinierte Ansicht wurde benanntTestViewFont
:Ich habe dann den
obtainStyledAttributes
Aufruf in der benutzerdefinierten Ansicht geändert , um dies widerzuspiegeln:Der Code lief noch. Ich denke also nicht, dass es eine Art Selbstbeobachtung durch
declare-styleable
die Klasse ist, nach der es benannt ist.Daher glaube ich, dass alle benutzerdefinierten Attribute verwendet werden können, um einen Stil zu deklarieren, ohne auf einen Namespace zu verweisen.
Trotzdem, danke für all die Hilfe, es hat mein Problem gelöst.
quelle
declare-styleable
Block deklariert sind oder nicht. (Entschuldigung, ich kann die Referenzseite dafür nicht finden ...) Mit Ausnahme von Attributen aus demandroid
Namespace sollten Sie nur den Attributnamen angeben.Definieren Sie einige Attribute
Verwenden Sie es in Layout-Dateien wie
Verwenden Sie es schließlich in der Style-Datei
Der Unterschied zwischen Style-Datei und Layout-Datei besteht darin, dass keine Präfixe hinzugefügt werdenapp:
Probieren Sie es aus, haben Sie einen schönen Tag, das funktioniert für mich.
quelle
Falls es jemand anderem hilft, war mein Fehler, dass meine benutzerdefinierte Ansichtsklasse AttributeSet.getAttributeValue aufrief, z
... was dazu führte, dass mein benutzerdefiniertes Attribut für meine benutzerdefinierte Ansicht nicht eingelesen wurde.
Das Update sollte
obtainStyledAttributes
in meiner benutzerdefinierten Ansicht verwendet werden:Ein Hinweis darauf, dass dies korrekt funktioniert, ist, dass Sie bei
R.styleable.MyTextViewStyleable_customFont
gedrückter Strg- / Apple- Taste auf klicken können , um direkt zu Ihrer attrs.xml-Definition zu gelangen.Ich habe eine Weile gebraucht, um diesen kritischen Unterschied zwischen meinem Code und den anderen Beispielen zu erkennen, da das benutzerdefinierte Attribut gut funktioniert hat, wenn es direkt über das Layout-XML (anstelle eines Stils) übergeben wurde.
quelle