studio examples example custom constraint clase android android-layout android-view android-attributes

examples - android.view.InflateException cuando se utiliza selectableItemBackground



framelayout (3)

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 agregué código para detectar la excepción y llamar a getCause() hasta que devuelva un valor nulo, 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 al que hace referencia es ?selectableItemBackground SelectableItemBackground.

Reduje la excepción a mi 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 desenterré este código después de unos meses, y ahora se bloquea con la excepción. Supongo que esto está relacionado con la actualización de la biblioteca de soporte a 23.0.1 y el SDK de destino a 23, pero aún no he cambiado a 22 para verificarlo.

Todo funciona bien si elimino la referencia de una línea ?selectableItemBackground . También probé '' ?attr/selectableItemBackground y'' ?android:attr/selectableItemBackground , pero obtuve los mismos resultados. (Este último me hace creer que puede que no sea un problema con la biblioteca de soporte).

EDITAR:

Lo miré en el depurador y sospecho 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 finalmente 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 en Android 6.0: el código 5.0 es bastante diferente, pero el tema se pasa al cargar el dibujo. 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.

Sin embargo, parece un error flagrante, así que no estoy convencido de que estoy en el camino correcto aquí. ¿Algunas ideas?


Como dice @Artjom, el problema está en pasar el application context al crear una vista personalizada. También estaba enfrentando el mismo problema y estaba pasando getApplicationContext() lugar de la activity como context . Después de pasar la Activity como un problema de context resuelto.

Espero que pueda ayudar a alguien más.


Desafortunadamente, otras respuestas no son mi caso. La forma de trabajar para mí es verificar si su actividad utiliza el estilo de tema AppCompat:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> </style>

Luego use el tema AppCompat en su actividad (de muchas maneras, pero muestro la forma de usar Manifest):

<application android:name=".Abbott" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- Any configuration inside --> </application>


La respuesta oficial: no se pueden usar los atributos del tema para los atributos de android:drawable o android:src . 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 dibujo?

En mi caso, realmente no podría hacer eso ya que AppCompat''s ?selectableItemBackground SelectableItemBackground hace referencia a un dibujo privado. Así que opté por una solución de código: estoy configurando el primer plano para ?selectableItemBackground mientras la tarjeta no está seleccionada, y mi propia lista de estados se puede dibujar una vez que esté en el 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 se me ha ocurrido hasta ahora. Si alguien tiene una solución mejor, me encantaría escucharla.