2015-08-27 15 views
5

Ho un componente personalizzato chiamato CircleView, e voglio cambiare un attributo personalizzato chiamato fillColor definito attrs.xml:Come impostare gli attributi personalizzati dei componenti personalizzati a livello di programmazione?

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

Ho impostato inizialmente in mio layout XML, che attualmente si presenta così (namespace circleview è definita come xmlns:circleview="http://schemas.android.com/apk/res-auto", funziona benissimo quando mi definisco in XML, quindi questo non dovrebbe essere un problema):

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

posso ottenere l'attributo fillColor bene nel mio CircleView , che si estende View, ma non so come impostare il suo valore.

Ho studiato cose come setBackgroundColor e ho cercato altri metodi "set", ma non sono riuscito a trovarne. Ho immaginato un metodo come

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

risposta

3

A CircleView nel layout non è altro che un'istanza della classe CircleView, così semplicemente aggiungere una funzione in CircleView.java:

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

E quindi chiamare ogni volta necessario:

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

Nota anche che questo cambia solo una variabile interna, ma tu è ancora necessario ridisegnare il componente personalizzato utilizzando il metodo invalidate() della classe View, poiché il componente personalizzato viene ridisegnato automaticamente solo se l'intera vista viene ridisegnata, ad es. quando si cambia frammento (vedi: Force a View to redraw itself).

(Ho pensato che questo alla fine molto quando ero sul punto di chiedere: "Avrei bisogno di definire questo me stesso?" E ho cercato di definire me stesso, e ha funzionato.)

+0

Sì, non c'è niente nello strumento Android di serie che aggiunge automagicamente accessor corrispondenti a attributi, in parte perché potrebbe non essere la risposta giusta per tutti i casi d'uso. Non sono a conoscenza di librerie di terze parti che offrono questo, ma potrei sicuramente sembrare che qualcuno arrotoli un processore di annotazioni che ha tentato di fare questo tipo di generazione di codice. – CommonsWare

+0

Giusto, Android Studio cerca silenziosamente di aiutare i nomi dei metodi di autocompleting (dopo aver digitato 'public void set', suggerisce' set ', ma penso che sia tutto ciò che accade per ora. – mz496