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:

 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?

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.

  • MuPDF para Android: opción para el fragmento en su lugar Actividad
  • Manejo de enfoque personalizado de ViewGroup
  • Barra lateral de Android como facebook o firefox
  • RemoveAllViews no quitar vistas
  • Configuración de las cookies de Webview de Android desde un archivo HTML en el directorio de activos
  • Uso de forceLayout (), requestLayout () e invalidate ()
  • Android: Añadir botón a YouTubePlayerView
  • No se puede mostrar 2 instancias de mi SurfaceView personalizado
  • Atributos del mismo nombre en attrs.xml para vista personalizada
  • Diferencia en los diseños de diseño de Android entre las versiones 2.3.3 y 4+
  • Cómo deshabilitar cualquier evento en una vista en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.