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:
- Agregar vista a disposición relativa detrás de una vista existente provoca parpadeo de la pantalla
- Las vistas agregadas a TableLayout no se muestran mediante programación
- ConstraintLayout vistas en esquina superior izquierda
- ¿Cómo puede saber si una vista es visible en la pantalla en Android?
- Controlar la visibilidad de la vista desde un recurso
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?
- Cómo establecer vistas en RelativeLayout mediante programación?
- Invalidate () no vuelve a dibujar a los niños
- CircledImageView siempre tiene una imagen de rectángulo delante del círculo
- Adición de TextViews al widget de pantalla de inicio mediante programación
- Elemento compartido animación entre RecyclerView elemento y CollapsingToolbar dentro de la misma actividad
- Cambiar los archivos de diseño en la misma actividad
- ¿Cómo puedo definir el tamaño de los dibujables en el archivo de estilo?
- Android WebView pierde cookies en los redireccionamientos
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.