2015-08-27 7 views
5

Ich habe eine benutzerdefinierte Komponente CircleView genannt, und ich möchte fillColor definiert ein benutzerdefiniertes Attribut ändern genannt in attrs.xml: in meinem Layout XMLWie programmgesteuert benutzerdefinierte Attribute von benutzerdefinierten Komponenten festlegen?

<declare-styleable name="CircleView"> 
    <attr name="radius" format="integer" /> 
    <attr name="fillColor" format="color" /> 
</declare-styleable> 

Ich habe es anfänglich, die wie dieser (Namespace sieht derzeit circleview ist definiert als xmlns:circleview="http://schemas.android.com/apk/res-auto", es funktioniert gut, wenn ich es in der XML definieren, so sollte dies kein Problem sein):

<com.mz496.toolkit.CircleView 
    ... 
    circleview:fillColor="#33ffffff"/> 

ich das fillColor Attribut ganz gut in meinem CircleView bekommen , die View erweitert, aber ich weiß nicht, wie man seinen Wert einstellt.

Ich habe Dinge wie setBackgroundColor suchte und suchte nach anderen „set“ Methoden, aber ich konnte keine finden. Ich stellte mir vor, ein Verfahren wie

circle.setAttribute(R.styleable.CircleView_fillColor, "#33ff0000")

Antwort

3

A CircleView im Layout ist nichts anderes als eine Instanz der CircleView Klasse, so einfach eine Funktion in CircleView.java hinzufügen:

public void setFillColor(int newColor) { 
    fillColor = newColor; 
} 

Und dann nennen Sie es, wann immer benötigt:

CircleView circle_view = (CircleView) findViewById(R.id.circle_view); 
circle_view.setFillColor(0x33ffffff); 
circle_view.invalidate(); 

Beachten Sie auch, dass dies ändert nur eine interne Variable, aber Sie wenn die gesamte Ansicht neu gezeichnet wird, muß noch die individuelle Komponente unter Verwendung des Verfahrens der invalidate()View Klasse neu zu zeichnen, da die individuelle Komponente nur automatisch neu gezogen wird, z.B. beim Umschalten von Fragmenten (siehe: Force a View to redraw itself).

(ich dachte, das ganz am Ende, wenn ich fragen gerade dabei war, „Würde ich das selbst definieren müssen?“ Und ich versuchte, es selbst zu definieren, und es funktionierte.)

+0

Ja, es gibt nichts, in der Android-Tooling-Tool, die automatisch hinzugefügt Accessoren Attribute, zum Teil, weil dies möglicherweise nicht die richtige Antwort für alle Anwendungsfälle. Mir sind keine Bibliotheken von Drittanbietern bekannt, die dies anbieten, aber ich könnte mir vorstellen, dass jemand einen Annotationsprozessor rollt, der diese Art von Codegenerierung versucht. – CommonsWare

+0

Recht, Android Studio versucht, leise von Autovervollständigen Methodennamen zu helfen (nach 'public void Set' eingeben, schlägt er' set ', aber ich denke, dass ist alles, was jetzt passiert. – mz496