Cómo establecer atributos personalizados de componentes personalizados de forma programática?
Tengo un componente personalizado llamado CircleView
, y quiero cambiar un atributo personalizado llamado fillColor
definido en attrs.xml
:
<declare-styleable name="CircleView"> <attr name="radius" format="integer" /> <attr name="fillColor" format="color" /> </declare-styleable>
Lo he establecido inicialmente en mi XML de diseño, que actualmente se parece a esto (namespace circleview
se define como xmlns:circleview="http://schemas.android.com/apk/res-auto"
, funciona bien cuando lo defino En el XML, por lo que esto no debería ser un problema):
<com.mz496.toolkit.CircleView ... circleview:fillColor="#33ffffff"/>
Puedo obtener el atributo fillColor
bien en mi CircleView
, que extiende View
, pero no sé cómo establecer su valor.
He investigado cosas como setBackgroundColor
y buscado otros métodos "set", pero no pude encontrar ninguno. Imaginé un método como
circle.setAttribute(R.styleable.CircleView_fillColor, "#33ff0000")
Un CircleView
en el diseño no es más que una instancia de la clase CircleView
, por lo que simplemente agregue una función a CircleView.java
:
public void setFillColor(int newColor) { fillColor = newColor; }
Y luego llámelo cuando sea necesario:
CircleView circle_view = (CircleView) findViewById(R.id.circle_view); circle_view.setFillColor(0x33ffffff); circle_view.invalidate();
También tenga en cuenta que esto sólo cambia una variable interna, pero todavía necesita volver a dibujar el componente personalizado utilizando el método invalidate()
de la clase View
, ya que el componente personalizado sólo se vuelve a dibujar automáticamente si se vuelve a dibujar la vista completa, por ejemplo, al cambiar fragmentos Vea: forzar una vista para que se vuelva a dibujar ).
(Pensé en esto al final cuando estaba a punto de preguntar, "¿Tendría que definir esto yo mismo?" Y traté de definirlo yo mismo, y funcionó.)