android.content.res.resources $ NotFoundException al configurar programáticamente Android.R.Attr.ListChoiceIndicatormultiple
-
23-10-2019 - |
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.
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);