InflateException com FloatingActionButton da Official Design Library

88

Estou recebendo um bug ao usar o oficial FloatingActionButtonda biblioteca de design de suporte do Google.

Aqui está meu 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

A única linha que aponta para meu aplicativo é onde ele aumenta o xmlarquivo e a linha desse arquivo que é meu 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" />

Informação extra:

Aqui está o tema do meu aplicativo:

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

Sim, estou usando um AppCompatActivity.

Percebi que estou usando uma versão mais antiga do appcompat:

com.android.support:appcompat-v7:22.1.1

Parece estar atualizado:

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

Além disso,

minSdkVersion 16
targetSdkVersion 22

Agora, eu defino a Visibilidade GONEem alguns casos para meu FAB, mas isso é depois que ele infla, então esse não pode ser o problema.

Agora, isso funciona com meu dispositivo 5.1, mas os usuários que têm problemas têm 5.0.

Este é um bug conhecido ou talvez eu esteja fazendo algo errado?

TheLettuceMaster
fonte
5
android:backgroundTintpode ser problemático em dispositivos pré-pirulito. Use em seu app:backgroundTintlugar. No entanto, não posso apontar quaisquer problemas para o 5.0.
Markus Rubey
Obrigado @MarkusRubey. Isso vale a pena mudar. Eu mudei isso e atualizei minha biblioteca appCompat no Gradle e verifiquei se isso corrige o problema. Eu sei que ele nunca travou em um dispositivo ou emulador anterior a 5.0 para mim quando eu estava testando, embora eu tivesse esse tom. Mas nem todos os dispositivos são criados iguais ...
TheLettuceMaster
1
@MarkusRubey Acho que foi seu comentário que corrigiu esse problema. Um problema com tingimento que eu acho que é compatível para 5.1 a menos que você use appcomo diz. Sinta-se à vontade para adicioná-lo como resposta.
TheLettuceMaster

Respostas:

225

com.android.support:appcompat-v7:21+adicionado suporte para tingir widgets em dispositivos com Android 5.1 (API de nível 21). Para usá-lo, certifique-se de estender ou definir o AppCompatTema e usar em app:backgroundTintvez de android:backgroundTint.

Exemplo:

<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
fonte
5
Observe que o suporte backgroundTint foi adicionado na API 21 (Android 5.0): developer.android.com/reference/android/… Portanto, de acordo com as especificações, você deve ser capaz de usar backgroundTint no Android 5.0 sem a biblioteca de suporte. Na prática, parece travar e você precisa usar a biblioteca de suporte para fazê-lo funcionar. Eu apenas pensei em mencionar isso para qualquer pessoa confusa por que uma API rotulada como v21 na documentação dev não funciona até a v22; parece ser um bug.
OldSchool4664
50

Apenas substitua

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

para

<android.support.design.widget.FloatingActionButton 
...
...
app:backgroundTint
/>
Abhijeet Mallick
fonte
3
Não se esqueça de adicionar o namespace xmlns: app = " schemas.android.com/apk/res-auto "!
Set
O problema no meu caso foi definir o fundo com o atributo android: background. Substituir por app: backgroundTint resolveu o problema
Andrey Kolesnikov
13

Se você estiver usando um VectorDrawableCompat(ativo vetorial), deve usar:

app:srcCompat="@drawable/x"

ao invés de:

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

Eu tive o mesmo problema e tentei uma solução diferente. Mas o que funcionou para mim foi garantir que as versões appcompat e design support library sejam as mesmas. por exemplo:

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

Outra maneira de obter essa mensagem é se você acidentalmente especificou versões diferentes da biblioteca appcompat em módulos diferentes. É provável que isso aconteça quando você cria um novo módulo, já que o padrão do Android Studio é a versão mais atual.

Para obter uma maneira organizada de gerenciar isso em projetos com vários módulos, consulte: No Gradle, como declaro dependências comuns em um único lugar?

Ehartwell
fonte
3

Basta mudar androidpara app:

android:backgroundTint="@color/accent"

Para:

app:backgroundTint="@color/accent"
G.Alima
fonte
2
Bem-vindo ao Stack Overflow! Imagens e capturas de tela podem ser uma boa adição a uma postagem, mas certifique-se de que a postagem ainda seja clara e útil sem elas. Não poste imagens de código ou mensagens de erro. Leia por quê . Em vez disso, copie e cole ou digite o código / mensagem real diretamente na postagem.
Filnor de
0

no meu caso, foi por causa da falsa configuração do tema da atividade. O problema foi resolvido depois que mudei o tema do aplicativo para Theme.AppCompat.xxx.

Stevens
fonte