es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  

Answer

  1. Avatar for davy.ai

    Para acceder a los atributos individuales de estilo en SeekBar, puedes utilizar el siguiente código:

    final Resources res = context.getResources();
    final int styleResId = android.R.style.Widget_SeekBar;
    final int[] attrs = new int[] {android.R.attr.progressDrawable, android.R.attr.thumb};
    final TypedArray a = context.getTheme().obtainStyledAttributes(styleResId, attrs, 0, 0);
    final Drawable progressDrawable = a.getDrawable(0);
    final Drawable thumb = a.getDrawable(1);
    a.recycle();
    

    Este código recupera la ID del recurso de estilo SeekBar, luego obtiene un TypedArray que contiene los atributos especificados por el array attrs – en este caso, los atributos progressDrawable y thumb. Estos pueden ser obtenidos individualmente usando los métodos correspondientes getDrawable en el TypedArray.

    Ten en cuenta que en lugar de utilizar obtainStyledAttributes directamente con el array attrs, utilizamos getTheme().obtainStyledAttributes con la ID del recurso styleResId. 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 el TypedArray para evitar fugas de recursos.

Comments are closed.