InflateException con FloatingActionButton de la biblioteca de diseño oficial

88

Recibo un error al usar el funcionario FloatingActionButtonde la biblioteca de diseño de soporte de Google.

Aquí está mi LogCat.

android.view.InflateException: Binary XML file line #34: Error inflating class android.support.design.widget.FloatingActionButton
at android.view.LayoutInflater.createView(LayoutInflater.java:633)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:655)
at android.view.LayoutInflater.inflate(Unknown Source)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at ---.---.com.---.SubCategoryFragment.onCreateView(SubCategoryFragment.java:47)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:117)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at android.view.LayoutInflater.createView(LayoutInflater.java:607)
... 24 more
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:968)
at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1014)
at android.graphics.drawable.RippleDrawable$RippleState.<init>(RippleDrawable.java:910)
at android.graphics.drawable.RippleDrawable.createConstantState(RippleDrawable.java:901)
at android.graphics.drawable.RippleDrawable.createConstantState(RippleDrawable.java:90)
at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:932)
at android.graphics.drawable.RippleDrawable.mutate(RippleDrawable.java:891)
at android.view.View.applyBackgroundTint(View.java:16324)
at android.view.View.setBackgroundDrawable(View.java:16193)
at android.support.design.widget.FloatingActionButton.access$201(FloatingActionButton.java:56)
at android.support.design.widget.FloatingActionButton$1.setBackgroundDrawable(FloatingActionButton.java:118)
at android.support.design.widget.FloatingActionButtonLollipop.setBackgroundDrawable(FloatingActionButtonLollipop.java:75)
at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:131)
at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:79)
... 27 more

La única línea que apunta a mi aplicación es donde infla el xmlarchivo y la línea en ese archivo que es my FloatingActionButton.

   <android.support.design.widget.FloatingActionButton
        android:id="@+id/myFABSubCat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_margin="16dp"
        android:backgroundTint="@color/accent"
        android:src="@drawable/add_icon"
        app:borderWidth="0dp"
        app:elevation="4sp" />

Información extra:

Aquí está el tema de mi aplicación:

<resources>

    <!-- Base application theme. -->
    <style name="MBTIAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primaryDark</item>
        <item name="colorAccent">@color/accent</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

    <style name="ThemeNoActionBar" parent="MBTIAppTheme">
        <item name="windowActionBar">false</item>
    </style>

</resources>

Sí, estoy usando un AppCompatActivity.

Noté que estoy usando una versión anterior de appcompat:

com.android.support:appcompat-v7:22.1.1

Esto parece estar actualizado:

compile 'com.android.support:design:22.2.0'

También,

minSdkVersion 16
targetSdkVersion 22

Ahora, configuro la Visibilidad GONEen algunos casos para mi FAB, pero esto es después de que se infla, por lo que ese no puede ser el problema.

Ahora, esto funciona con mi dispositivo 5.1, pero los usuarios que tienen problemas tienen 5.0.

¿Es un error conocido o quizás estoy haciendo algo mal?

TheLettuceMaster
fuente
5
android:backgroundTintpodría ser problemático en dispositivos anteriores a la piruleta. Úselo en su app:backgroundTintlugar. Sin embargo, no puedo señalar ningún problema para 5.0.
Markus Rubey
@MarkusRubey Gracias. Vale la pena cambiarlo. Cambié eso y actualicé mi biblioteca appCompat en Gradle y verifiqué si esto soluciona el problema. Sé que nunca se bloqueó en un dispositivo o emulador anterior a 5.0 para mí cuando estaba probando a pesar de que tenía ese tinte. Pero no todos los dispositivos se crean de la misma manera ...
TheLettuceMaster
1
@MarkusRubey Creo que fue tu comentario el que solucionó este problema. Un problema con el teñido que creo que es compatible para 5.1 hasta que lo uses appcomo dices. Siéntase libre de agregarlo como respuesta.
TheLettuceMaster

Respuestas:

225

com.android.support:appcompat-v7:21+Se agregó soporte para teñir widgets en dispositivos con versiones anteriores a Android 5.1 (API nivel 21). Para usarlo, asegúrese de extender o configurar el AppCompattema y usarlo en app:backgroundTintlugar de android:backgroundTint.

Ejemplo:

<android.support.design.widget.FloatingActionButton 
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    android:src="@drawable/icon"
    app:backgroundTint="@color/accent"
    app:borderWidth="0dp" />
Markus Rubey
fuente
5
Tenga en cuenta que la compatibilidad con backgroundTint se agregó en API 21 (Android 5.0): developer.android.com/reference/android/… Por lo tanto, de acuerdo con las especificaciones, debería poder usar backgroundTint en Android 5.0 sin la biblioteca de soporte. En la práctica, parece fallar y es necesario utilizar la biblioteca de soporte para que funcione. Pensé que mencionaría esto para cualquier otra persona que esté confundida por qué una API etiquetada como v21 en la documentación del desarrollador no funciona realmente hasta la v22; Parece ser un error.
OldSchool4664
50

Solo reemplaza

<android.support.design.widget.FloatingActionButton 
...
...
android:backgroundTint
/>

a

<android.support.design.widget.FloatingActionButton 
...
...
app:backgroundTint
/>
Abhijeet Mallick
fuente
3
¡No olvide agregar el espacio de nombres xmlns: app = " schemas.android.com/apk/res-auto "!
Sev
El problema en mi caso fue configurar el fondo con android: atributo de fondo. Reemplazar con la aplicación: backgroundTint resolvió el problema
Andrey Kolesnikov
13

Si está utilizando un VectorDrawableCompat(activo de Vector), debería utilizar:

app:srcCompat="@drawable/x"

en vez de:

android:src="@drawable/x"
Ab ِ
fuente
7

Tuve el mismo problema y probé una solución diferente. Pero el que funcionó para mí fue asegurarme de que las versiones de la biblioteca de soporte de diseño y appcompat sean las mismas. por ejemplo:

compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
sashk0
fuente
3

Otra forma de recibir este mensaje es si accidentalmente especificó diferentes versiones de la biblioteca appcompat en diferentes módulos. Es probable que esto suceda cuando creas un nuevo módulo, ya que Android Studio tiene por defecto la versión más actual.

Para obtener una forma ordenada de administrar esto en proyectos de varios módulos, consulte: En Gradle, ¿cómo declaro dependencias comunes en un solo lugar?

ehartwell
fuente
3

Solo cambia androida app:

android:backgroundTint="@color/accent"

A:

app:backgroundTint="@color/accent"
G.Alima
fuente
2
¡Bienvenido a Stack Overflow! Las imágenes y capturas de pantalla pueden ser una buena adición a una publicación, pero asegúrese de que la publicación sea clara y útil sin ellas. No publique imágenes de códigos o mensajes de error. Lea por qué . En su lugar, copie y pegue o escriba el código / mensaje real en la publicación directamente.
Filnor
0

en mi caso, fue por la falsa configuración del tema de actividad. El problema se resolvió después de que cambié el tema de la aplicación a Theme.AppCompat.xxx.

Stevens
fuente