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.

Це відома помилка чи, можливо, я роблю щось не так?


5
android:backgroundTintможе викликати клопоти на пристроях до льодяника. Використовуйте app:backgroundTintзамість цього. Я не можу вказати на будь-які проблеми для 5.0, хоча.
Маркус Рубі

@MarkusRubey Дякую. Це варто змінити. Я змінив це та оновив свою бібліотеку appCompat у Gradle та перевірив, чи вирішує це проблему. Я знаю, що він ніколи не розбивався на пристрої pre 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 "!
Sev

Проблемою в моєму випадку було встановлення фону за допомогою атрибута android: background. Замінити на додаток: backgroundTint вирішив проблему
Андрій Колесніков

13

Якщо ви використовуєте VectorDrawableCompat(векторний актив), вам слід використовувати:

app:srcCompat="@drawable/x"

замість:

android:src="@drawable/x"

7

У мене була та сама проблема, і я спробував інше рішення. Але те, що мені вдалося, було забезпечити однакові версії appcompat та бібліотеки підтримки дизайну. наприклад:

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

3

Інший спосіб отримати це повідомлення - якщо ви випадково вказали різні версії бібліотеки appcompat у різних модулях. Це, швидше за все, трапиться під час створення нового модуля, оскільки Android Studio за замовчуванням має останню версію.

Охайний спосіб управління цим у мультимодульних проектах див. У : Як у Gradle оголосити загальні залежності в одному місці?


3

Просто змініть androidна app:

android:backgroundTint="@color/accent"

Кому:

app:backgroundTint="@color/accent"

2
Ласкаво просимо до Stack Overflow! Зображення та знімки екрана можуть бути приємним доповненням до публікації, але переконайтесь, що публікація без них залишається чіткою та корисною. Не розміщуйте зображення коду або повідомлень про помилки. Прочитайте чому . Натомість скопіюйте та вставте або введіть фактичний код / ​​повідомлення безпосередньо в публікацію.
Філнор

0

у моєму випадку це було через помилкову конфігурацію теми діяльності. проблема була вирішена після того, як я змінив тему програми на Theme.AppCompat.xxx.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.