android.content.res.resources $ NotFoundException al configurar programáticamente Android.R.Attr.ListChoiceIndicatormultiple

StackOverflow https://stackoverflow.com/questions/4783002

Pregunta

Estoy intentando establecer programáticamente el atributo "Android: CheckMark" en los elementos checkedTextView que tengo en una vista de lista. Al ejecutar mi aplicación obtengo 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 forma de hacerlo desde Java? Intenté (y logré) activar el comportamiento deseado del diseño XML:

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

La cosa es que no sé en el momento de la compilación si debería ser

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

o

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

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

¿Fue útil?

Solución

Supongo que establecer programáticamente un atributo referencia en lugar de un Drawable La referencia es el problema.

En este caso, android.R.attr.listChoiceIndicatorMultiple corresponde a android.R.drawable.btn_check, por lo que podrías intentar configurar eso en su lugar.


O, si puede obtener los atributos, puede llamar getDrawable() sobre el TypedArray para obtener dinámicamente el Drawable valor.

Editar:
Ya que el valor de listChoiceIndicatorMultiple Depende del tema actual, debe pedirle al tema actual que resuelva 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 elemento de su ListView.

Ese es un ejemplo muy básico, pero funciona con el tema predeterminado. No estoy exactamente seguro de lo que se debe hacer para resolver attrs Totalmente si tiene un tema personalizado.

Otros consejos

Si usar las alternativas simples de la biblioteca AppCompat sería:

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

o:

setCheckMarkDrawable(android.support.v7.appcompat.R.drawable.abc_btn_radio_material);  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top