web-dev-qa-db-fra.com

InflateException avec FloatingActionButton de la bibliothèque de design officiel

Je reçois un bogue en utilisant le FloatingActionButton officiel de la bibliothèque de concepteurs 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 fichier xml 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 le thème de mon 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 d'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 GONE dans certains cas pour mon FAB, mais c'est après son gonflement que le problème ne peut pas être résolu.

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?

87
KickingLettuce

com.Android.support:appcompat-v7:21+ ajout du support pour la coloration des widgets sur les appareils exécutant une version antérieure à Android 5.1 (API de niveau 21). Pour l'utiliser, assurez-vous d'étendre ou de définir le thème AppCompat et d'utiliser app:backgroundTint à la place 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" />
224
Markus Rubey

Il suffit de remplacer

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

à

<Android.support.design.widget.FloatingActionButton 
...
...
app:backgroundTint
/>
48
Abhijeet Mallick

Si vous utilisez un VectorDrawableCompat (ressource vectorielle), vous devez utiliser:

app:srcCompat="@drawable/x"

au lieu de:

Android:src="@drawable/x"
10
Ab_

J'ai eu le même problème et essayé une solution différente. Mais celui qui a fonctionné pour moi a été de faire en sorte que les versions de bibliothèque de support de conception et d’appcompat soient les mêmes. par exemple:

compile 'com.Android.support:appcompat-v7:23.2.0'
compile 'com.Android.support:design:23.2.0'
7
sashk0

Remplacez simplement Android par app:

Android:backgroundTint="@color/accent"

À:

app:backgroundTint="@color/accent"
3
G.Alima

Si vous avez accidentellement spécifié différentes versions de la bibliothèque appcompat dans différents modules, vous pouvez également obtenir ce message. 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 une manière ordonnée de gérer cela dans des projets multi-modules, voir: Dans Gradle, comment déclarer des dépendances communes à un seul endroit?

3
ehartwell

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

0
Stevens