InflateException avec FloatingActionButton de la bibliothèque de conception officielle

88

Je reçois un bug en utilisant le fonctionnaire FloatingActionButtonde la bibliothèque de conception de support de Google.

Voici mon 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 seule ligne qui pointe vers mon application est l'endroit où elle gonfle le xmlfichier et la ligne de ce fichier qui est mon 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" />

Informaitons supplémentaires:

Voici mon thème d'application:

<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>

Oui, j'utilise un AppCompatActivity.

J'ai remarqué que j'utilise une ancienne version de appcompat:

com.android.support:appcompat-v7:22.1.1

Cela semble être à jour:

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

Aussi,

minSdkVersion 16
targetSdkVersion 22

Maintenant, je règle la visibilité sur GONEdans certains cas pour mon FAB, mais c'est après qu'il se gonfle, donc cela ne peut pas être le problème.

Maintenant, cela fonctionne avec mon appareil 5.1, mais les utilisateurs qui ont des problèmes ont 5.0.

Est-ce un bug connu ou peut-être que je fais quelque chose de mal?

TheLettuceMaster
la source
5
android:backgroundTintpourrait être gênant sur les appareils pré sucette. Utilisez app:backgroundTintplutôt. Je ne peux cependant signaler aucun problème pour la version 5.0.
Markus Rubey
@MarkusRubey Merci. Cela vaut la peine de changer. J'ai changé cela et mis à jour ma bibliothèque appCompat dans Gradle et vérifié si cela résout le problème. Je sais qu'il ne s'est jamais écrasé sur un appareil ou un émulateur pré-5.0 pour moi lorsque je testais, même si j'avais cette teinte. Mais tous les appareils ne sont pas créés égaux ...
TheLettuceMaster
1
@MarkusRubey Je crois que c'est votre commentaire qui a résolu ce problème. Un problème de teinte qui, je pense, est compatible pour 5.1 up à moins que vous n'utilisiez appcomme vous le dites. N'hésitez pas à l'ajouter comme réponse.
TheLettuceMaster

Réponses:

225

com.android.support:appcompat-v7:21+Ajout de la prise en charge des widgets de teinture sur les appareils fonctionnant avant Android 5.1 (niveau d'API 21). Pour l'utiliser, assurez-vous d'étendre ou de définir le AppCompatthème et de l'utiliser à la app:backgroundTintplace de android:backgroundTint.

Exemple:

<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
la source
5
Notez que la prise en charge de backgroundTint a été ajoutée dans l'API 21 (Android 5.0): developer.android.com/reference/android/... Donc, selon les spécifications, vous devriez pouvoir utiliser backgroundTint dans Android 5.0 sans la bibliothèque de support. En pratique, il semble planter et vous devez utiliser la bibliothèque de support pour le faire fonctionner. Je pensais juste que je mentionnerais ceci pour quiconque ne comprend pas pourquoi une API étiquetée v21 dans la documentation de développement ne fonctionne pas réellement avant la v22; cela semble être un bug.
OldSchool4664
50

Remplacez simplement

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

à

<android.support.design.widget.FloatingActionButton 
...
...
app:backgroundTint
/>
Abhijeet Mallick
la source
3
N'oubliez pas d'ajouter l' espace de noms xmlns: app = " schemas.android.com/apk/res-auto "!
Sev
problème dans mon cas était de définir l'arrière-plan avec android: attribut d'arrière-plan. Remplacer par l'application: backgroundTint a résolu le problème
Andrey Kolesnikov
13

Si vous utilisez un VectorDrawableCompat(élément vectoriel), vous devez utiliser:

app:srcCompat="@drawable/x"

au lieu de:

android:src="@drawable/x"
Un B
la source
7

J'ai eu le même problème et j'ai essayé une solution différente. Mais celui qui a fonctionné pour moi était de m'assurer que les versions de la bibliothèque de support d'application et de conception sont les mêmes. par exemple:

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

Une autre façon d'obtenir ce message est si vous avez accidentellement spécifié différentes versions de la bibliothèque appcompat dans différents modules. Cela est susceptible de se produire lorsque vous créez un nouveau module, car Android Studio utilise par défaut la version la plus récente.

Pour un moyen efficace de gérer cela dans les projets multi-modules, voir: Dans Gradle, comment déclarer des dépendances communes en un seul endroit?

Ehartwell
la source
3

Changez simplement androidpour app:

android:backgroundTint="@color/accent"

À:

app:backgroundTint="@color/accent"
G.Alima
la source
2
Bienvenue dans Stack Overflow! Les images et les captures d'écran peuvent être un ajout intéressant à un message, mais assurez-vous que le message est toujours clair et utile sans eux. Ne publiez pas d'images de code ou de messages d'erreur. Lisez pourquoi . Au lieu de cela, copiez et collez ou tapez le code / message réel dans la publication directement.
Filnor
0

dans mon cas, c'était à cause de la fausse configuration du thème de l'activité. Le problème a été résolu après avoir changé le thème de l'application en Theme.AppCompat.xxx.

Stevens
la source