2011-01-24 18 views
12

Estoy tratando de establecer programáticamente el atributo "android: checkMark" en elementos CheckedTextView que tengo en un ListView. Cuando se ejecuta mi aplicación tengo la siguiente excepción:

android.content.res.Resources$NotFoundException: Resource ID #0x101021a 

El recurso con ID # 0x101021a corresponde a android.R.attr.listChoiceIndicatorMultiple, que es exactamente el valor que estoy pasando a mi CheckedTextView:

mCheckedTextView.setCheckMarkDrawable(android.R.attr.listChoiceIndicatorMultiple) 

¿No es esta la manera de hacerlo desde Java? He intentado (y exitoso) para activar el comportamiento deseado de diseño XML:

<CheckedTextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
    android:id="@android:id/text1" /> 

El caso es que no sé en tiempo de compilación si debe ser

android:checkMark="?android:attr/listChoiceIndicatorMultiple" 

o

android:checkMark="?android:attr/listChoiceIndicatorSingle" 

Por lo tanto, necesito establecer estos valores en tiempo de ejecución.

+0

Gracias! Eso me ayudó mucho con un problema que tuve hoy. – Chris

+0

@Chris: De nada :-) – dbm

Respuesta

26

yo supongo que la fijación de programación un atributo de referencia en lugar de una referencia Drawable es el problema.

En este caso, android.R.attr.listChoiceIndicatorMultiplecorresponds toandroid.R.drawable.btn_check, lo que podría intentar establecer en su lugar.


O, si se puede obtener los atributos, se podría llamar getDrawable() en el TypedArray a buscar dinámicamente el valor Drawable.

Editar:
Como el valor de listChoiceIndicatorMultiple depende del tema actual, es necesario pedir al tema actual para resolver la referencia:

int[] attrs = { android.R.attr.listChoiceIndicatorMultiple }; 
TypedArray ta = getContext().getTheme().obtainStyledAttributes(attrs); 
Drawable indicator = ta.getDrawable(0); 
view.setCheckMarkDrawable(indicator); 
ta.recycle(); 

Asegúrese de almacenar en caché los dibujables, en lugar de realizar esta maniobra para cada artículo en su ListView.

Es solo un ejemplo muy básico, pero funciona con el tema predeterminado. No estoy exactamente seguro de qué se debe hacer para resolver attrs por completo si tiene un tema personalizado.

+0

Oh, lo siento, tienes razón. Mi culpa. – Beasly

+1

Esa es una muy buena respuesta (dado que ya he recorrido ese camino :-), sin embargo, parece que no hay dibujar "android.R.drawable.btn_check".Si busco en el sistema de archivos, sí lo encuentro (está en la carpeta "[path_to_android_SDK]/platforms/android-9/data/res/drawable" y es un archivo XML), pero al escribir mi código en consecuencia recibo errores de compilación quejándose de que "btn_check no se puede resolver o no es un campo válido". – dbm

+0

La otra sugerencia (la de "getDrawable()") es, sin embargo, nueva para mí. Aunque tendré que hacer algunas "tareas" sobre eso, ya que no he hecho esa maniobra antes :-) – dbm

0

Si se utiliza la biblioteca appcompat simples alternativas serían:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_check_material); 

o:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material); 
Cuestiones relacionadas