InflateException с FloatingActionButton из официальной библиотеки дизайна

88

Я получаю ошибку при использовании официального FloatingActionButtonиз библиотеки дизайна поддержки Google.

Вот мой 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

Единственная строка, которая указывает на мое приложение, - это то место, где оно раздувает xmlфайл, и строка в этом файле, которая принадлежит мне 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" />

Дополнительная информация:

Вот моя тема приложения:

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

Да, я использую AppCompatActivity.

Я заметил, что использую старую версию appcompat:

com.android.support:appcompat-v7:22.1.1

Кажется, это актуально:

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

Также,

minSdkVersion 16
targetSdkVersion 22

Теперь я GONEв некоторых случаях устанавливаю видимость для моего FAB, но это происходит после того, как он раздувается, так что это не может быть проблемой.

Теперь это работает с моим устройством 5.1, но у пользователей с проблемами 5.0.

Это известная ошибка или я что-то делаю не так?

TheLettuceMaster
источник
5
android:backgroundTintможет быть проблематичным на устройствах до леденца на палочке. app:backgroundTintВместо этого используйте . Я не могу указать на какие-либо проблемы с 5.0.
Маркус Руби
@MarkusRubey Спасибо. Это стоит изменить. Я изменил это и обновил свою библиотеку appCompat в Gradle и проверил, устраняет ли это проблему. Я действительно знаю, что он никогда не падал на устройстве или эмуляторе до 5.0, когда я тестировал, хотя у меня был этот оттенок. Но не все устройства созданы равными ...
TheLettuceMaster
1
@MarkusRubey Я считаю, что это ваш комментарий решил эту проблему. Проблема с тонировкой, которая, я думаю, совместима с 5.1 и выше, если вы не используете, appкак вы говорите. Не стесняйтесь добавлять его в качестве ответа.
TheLettuceMaster

Ответы:

225

com.android.support:appcompat-v7:21+добавлена ​​поддержка тонирования виджетов на устройствах под управлением Android до версии 5.1 (уровень API 21). Чтобы использовать его, убедитесь, что вы расширили или установили AppCompatтему и использовали app:backgroundTintвместо android:backgroundTint.

Пример:

<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" />
Маркус Рубей
источник
5
Обратите внимание, что поддержка backgroundTint была добавлена ​​в API 21 (Android 5.0): developer.android.com/reference/android/ ... Итак, согласно спецификации, вы должны иметь возможность использовать backgroundTint в Android 5.0 без библиотеки поддержки. На практике кажется, что он дает сбой, и вам нужно использовать библиотеку поддержки, чтобы заставить его работать. Я просто подумал, что упомяну об этом, если кто-то еще не понимает, почему API, помеченный как v21 в документации разработчиков, фактически не работает до v22; это похоже на ошибку.
OldSchool4664
50

Просто замените

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

к

<android.support.design.widget.FloatingActionButton 
...
...
app:backgroundTint
/>
Абхиджит Маллик
источник
3
Не забудьте добавить пространство имен xmlns: app = " schemas.android.com/apk/res-auto "!
Сев,
Проблема в моем случае заключалась в установке фона с атрибутом android: background. Заменить приложением: backgroundTint решил проблему
Андрей Колесников
13

Если вы используете VectorDrawableCompat(векторный актив), вы должны использовать:

app:srcCompat="@drawable/x"

вместо того:

android:src="@drawable/x"
Ab ِ
источник
7

У меня была такая же проблема, и я пробовал другое решение. Но то, что помогло мне, заключалось в том, чтобы убедиться, что версии appcompat и библиотеки поддержки дизайна совпадают. например:

compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
сашка0
источник
3

Другой способ получить это сообщение - если вы случайно указали разные версии библиотеки appcompat в разных модулях. Это может произойти при создании нового модуля, поскольку Android Studio по умолчанию использует самую последнюю версию.

Для аккуратного способа управления этим в многомодульных проектах см .: Как в Gradle объявить общие зависимости в одном месте?

Ehartwell
источник
3

Просто измените androidна app:

android:backgroundTint="@color/accent"

Кому:

app:backgroundTint="@color/accent"
Г.Алима
источник
2
Добро пожаловать в Stack Overflow! Изображения и скриншоты могут быть хорошим дополнением к сообщению, но убедитесь, что пост по-прежнему понятен и полезен без них. Не размещайте изображения кода или сообщения об ошибках. Прочтите почему . Вместо этого скопируйте и вставьте или введите фактический код / ​​сообщение непосредственно в сообщение.
Филнор
0

в моем случае это было из-за неправильной настройки темы активности. Проблема была решена после того, как я изменил тему приложения на Theme.AppCompat.xxx.

Стивенс
источник