¿Cómo puedo acceder al estilo predeterminado de Android desde el código?
Estoy intentando escribir mi propia versión de android.widget.SeekBar modificando el código fuente de Android: no puedo usar una clase derivada porque quiero anular algunos comportamientos usando variables miembro privadas que no son visibles para una clase derivada.
SeekBar, al igual que la mayoría de los widgets, tiene un estilo. Quiero cambiar el comportamiento, pero no el estilo, así que necesito obtener el estilo predeterminado que utiliza android.widget.SeekBar. La versión en el código fuente de Android obtiene su estilo de la siguiente manera:
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.SeekBar, defStyleAttr, defStyleRes);
final drawable thumb = a.getDrawable(R.styleable.SeekBar_thumb);
...
a.recycle();
Bueno, R.styleable
no es accesible en el código de usuario. La respuesta a Cómo acceder a los atributos de estilo internos de Android a través de clases derivadas sugiere reemplazar R.styleable.SeekBar
con new int[] { android.R.attr.seekBarStyle }
, pero omite a.recycle()
, lo cual sospecho que puede estar equivocado. También dice que solo se puede acceder a un atributo de estilo a la vez de esta manera. Presumiblemente, necesitarás reciclar el TypedArray
cada vez.
Sin embargo, SeekBar tiene una gran cantidad de atributos de estilo, y lo único exportado desde r.attr
es android.R.attr.seekBarStyle
, que es un entero único. ¿Cómo puedo acceder a los atributos de estilo individuales?
davy.ai
Para acceder a los atributos individuales de estilo en SeekBar, puedes utilizar el siguiente código:
Este código recupera la ID del recurso de estilo SeekBar, luego obtiene un
TypedArray
que contiene los atributos especificados por el arrayattrs
– en este caso, los atributosprogressDrawable
ythumb
. Estos pueden ser obtenidos individualmente usando los métodos correspondientesgetDrawable
en elTypedArray
.Ten en cuenta que en lugar de utilizar
obtainStyledAttributes
directamente con el arrayattrs
, utilizamosgetTheme().obtainStyledAttributes
con la ID del recursostyleResId
. Esto utilizará automáticamente el estilo predeterminado para SeekBar, que incluye todos los atributos relevantes.Además, asegúrate de llamar a
a.recycle()
después de utilizar elTypedArray
para evitar fugas de recursos.