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.

  • Viewpager + webview, cómo detener la carga de la webview
  • Android: LinearLayout addView Animación
  • Creación de una vista de imagen dibujable y zoomable en android
  • Use caracteres especiales en strings.xml para cargar en WebView
  • Cambiar el comportamiento de un GridView para que se desplace horizontalmente en lugar de verticalmente
  • ¿Cómo mantener los atributos de diseño en la vista personalizada android combinada?
  • Android: Añadir botón a YouTubePlayerView
  • Cómo establecer el ancho que es igual a otro widget en android
  • Android: Error al crear una instancia de una vista personalizada en XML
  • Llenando un círculo gradualmente de abajo a arriba android
  • Cómo hacer que el segundo fragmento se solape en el primer fragmento mientras que la transición del fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.