Android.view.InflateException al usar selectableItemBackground
Al inflar mi diseño, obtengo esta excepción:
E AndroidRuntime: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class <unknown> E AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:539) E AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:423) E AndroidRuntime: at com.myapp.view.MyRecyclerAdapter.onCreateViewHolder(MyRecyclerAdapter:80) E AndroidRuntime: at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5288) E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4551) E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4461) E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1962)
No hay "Causado por" en el registro, pero he añadido código para capturar la excepción y llamar a getCause()
hasta que devuelve null, y aquí está la secuencia de eventos:
- Cambiar usuario o volver a autenticar con Instagram
- ¿Cómo puedo dibujar una vista animada en android?
- ConstraintLayout vistas en esquina superior izquierda
- Forzar el reajuste en un grupo de vista incluyendo todos sus hijos
- ¿Hay una manera fácil de agregar un borde a la parte superior e inferior de una vista de Android?
android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class <unknown> android.view.InflateException: Binary XML file line #11: Error inflating class <unknown> Error: Binary XML file line #11: Error inflating class <unknown> android.content.res.Resources$NotFoundException: File res/drawable-v11/selectable_list_background.xml from drawable resource ID #0x7f020096 java.lang.UnsupportedOperationException: Failed to resolve attribute at index 0: TypedValue{t=0x2/d=0x7f0100f9 a=-1}
0x7f020096 es selectable_list_background (ver más abajo), y el TypedValue que hace referencia es ?selectableItemBackground
SelectableItemBackground.
Reduzco la excepción hasta el uso de ?selectableItemBackground
. Más específicamente, estoy usando un CardView:
<android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="match_parent" android:foreground="@drawable/selectable_list_background" card_view:cardCornerRadius="4dp" card_view:cardElevation="4dp" >
Y esta es la parte relevante de drawable/selectable_list_background
:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="?selectableItemBackground" /> </selector>
Esta actividad está usando mi propio tema, su padre es Theme.AppCompat.Light.NoActionBar
.
Este código solía funcionar, pero acabo de desenterrar este código después de unos meses, y ahora se bloquea con la excepción. Mi conjetura es que esto está relacionado con la actualización de la biblioteca de soporte a 23.0.1 y SDK objetivo a 23, pero no he cambiado de nuevo a 22 todavía para verificar eso.
¿Todo funciona bien si elimino la referencia de una línea ?selectableItemBackground
. También intenté ?attr/selectableItemBackground
y ?android:attr/selectableItemBackground
, pero conseguido los mismos resultados. (Este último me hace creer que puede no ser un problema con la biblioteca de soporte).
EDITAR:
Lo miré en el depurador, y tengo una sospecha de que es este código en android.content.res.Resources
, dentro de loadDrawable()
:
Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException { [...] dr = loadDrawableForCookie(value, id, null);
Tenga en cuenta que esta función toma un tema, pero no lo pasa al llamar a loadDrawableForCookie()
, que es el método que eventualmente activa la primera excepción:
java.lang.UnsupportedOperationException: Failed to resolve attribute at index 0: TypedValue{t=0x2/d=0x7f0100f9 a=-1} at android.content.res.TypedArray.getDrawable(TypedArray.java:867) at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:170) at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:115) at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1215) at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1124) at android.content.res.Resources.loadDrawableForCookie(Resources.java:2630) at android.content.res.Resources.loadDrawable(Resources.java:2540) at android.content.res.TypedArray.getDrawable(TypedArray.java:870) at android.view.View.<init>(View.java:4280)
Este código parece ser nuevo para Android 6.0 – el código 5.0 es muy diferente, pero el tema se pasa en la carga de la drawable. Y el tema es necesario AFAICT – el atributo en cuestión es parte de AppCompat
, por lo que necesita el tema de la actividad para resolverlo.
Eso parece un error flagrante, así que no estoy convencido de que estoy en el buen camino aquí. ¿Algunas ideas?
- EditText no desplazable dentro de ScrollView
- ViewStub vs View.GONE vs Inflate vs ViewSwitcher
- Uso de surfaceView para capturar un video
- Diferencia entre una vista de AppCompat y una vista de Android normal
- ¿Cómo puedo definir el tamaño de los dibujables en el archivo de estilo?
- ¿Por qué requestLayout se llama directamente después de invalidar
- ¿Cómo puedo asignar un ID a una vista mediante programación?
- Cómo cambiar el color del marcador actual de la pestaña en Android ViewPager?
La respuesta oficial – no se pueden utilizar los atributos del tema para android:drawable
o android:src
atributos. Simplemente no es posible, por diseño. Hay otra respuesta que explora el mismo problema y ofrece una solución: ¿Cómo hacer referencia a los atributos de estilo de un drawable?
En mi caso, realmente no podía hacer eso desde AppCompat ?selectableItemBackground
SelectableItemBackground hace referencia a un drawable privado. Así que opté por una solución de código – Estoy poniendo el primer plano a ?selectableItemBackground
mientras que la tarjeta no está seleccionada, ya mi propia lista de estado dibujable una vez que estoy en modo de selección.
Esta es una solución muy fea, tan fea que no voy a compartir el código aquí, pero lo mejor que podría llegar hasta ahora. Si alguien tiene una solución mejor, me encantaría escucharla.
Como @Artjom dice que el problema es pasar el application context
mientras se crea una vista personalizada. También estaba enfrentando el mismo problema y pasaba getApplicationContext()
lugar de la activity
como context
. Después de pasar Activity
como un problema de context
resuelto.
Espero que pueda ayudar a alguien más.