gowong/material-sheet-fab

FAB throws RuntimeException: Invalid drawable added to LayerDrawable! Drawable already belongs to another owner but does not expose a constant state.

Opened this issue · 2 comments

Idomo commented

I'm having problem with the FAB, it's throws this exception and I can't find the reason...
The app is not crashing, but this error occurs twice, one after the other, and this filling my logcat with bunch of code that "hiding" the important lines.
Logcat:

W/LayerDrawable: Invalid drawable added to LayerDrawable! Drawable already belongs to another owner but does not expose a constant state.
    java.lang.RuntimeException
        at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1850)
        at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1967)
        at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:168)
        at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1774)
        at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1780)
        at android.graphics.drawable.RippleDrawable.mutate(RippleDrawable.java:974)
        at android.view.View.applyBackgroundTint(View.java:20532)
        at android.view.View.setBackgroundDrawable(View.java:20403)
        at android.support.design.widget.FloatingActionButton.access$001(FloatingActionButton.java:68)
        at android.support.design.widget.FloatingActionButton$ShadowDelegateImpl.setBackgroundDrawable(FloatingActionButton.java:824)
        at android.support.design.widget.FloatingActionButtonLollipop.setBackgroundDrawable(FloatingActionButtonLollipop.java:73)
        at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:179)
        at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:151)
        at com.idomo.Fab.<init>(Fab.java:17)
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at android.view.LayoutInflater.createView(LayoutInflater.java:647)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
        at com.idomo.RecipesListFragment.onCreateView(RecipesListFragment.java:48)

My FAB class:

package com.idomo;

import android.content.Context;
import android.support.design.widget.FloatingActionButton;
import android.util.AttributeSet;
import android.view.View;

import com.gordonwong.materialsheetfab.AnimatedFab;

public class Fab extends FloatingActionButton implements AnimatedFab{

  public Fab(Context context){
    super(context);
  }

  public Fab(Context context, AttributeSet attrs){
    super(context, attrs); // **The error starts here** (line 17)
  }

  public Fab(Context context, AttributeSet attrs, int defStyleAttr){
    super(context, attrs, defStyleAttr);
  }

  @Override
  public void show(){
    show(0, 0);
  }

  @Override
  public void show(float translationX, float translationY){
    setVisibility(View.VISIBLE);
  }

  @Override
  public void hide(){
    setVisibility(View.INVISIBLE);
  }
}

XML (RecipesListFragment):

<!-- Your FAB implementation -->
  <com.idomo.Fab
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="start|bottom"
    android:layout_margin="@dimen/fab_margin"
    android:backgroundTint="@color/colorPrimary"
    android:src="@drawable/ic_edit" />

  <!-- Overlay that dims the screen -->
  <com.gordonwong.materialsheetfab.DimOverlayFrameLayout
    android:id="@+id/dim_overlay"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

  <!-- Circular reveal container for the sheet -->
  <io.codetail.widget.RevealLinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="start|bottom"
    android:orientation="vertical" />

  <!-- Sheet that contains your items -->
  <android.support.v7.widget.CardView
    android:id="@+id/fab_sheet"
    android:layout_width="200dp"
    android:layout_height="wrap_content">

    <ListView
      android:id="@+id/fabMenu"
      android:layout_width="match_parent"
      android:layout_height="wrap_content">
    </ListView>
  </android.support.v7.widget.CardView>

Thanks for helpers,
Ido.

For anyone who comes across this error too, the problem is
android:backgroundTint="@color/colorPrimary".
It helps to set a colorStateList instead, e.g. like this:
int[][] states = new int[][] {
new int[] { android.R.attr.state_enabled},
new int[] { android.R.attr.state_pressed}
};
int[] colors = new int[] {
ContextCompat.getColor(this, R.color.colorFab),
ContextCompat.getColor(this, R.color.colorFabPressed)
};
ColorStateList fabColorList = new ColorStateList(states, colors);
findViewById(R.id.fab).setBackgroundTintList(fabColorList);

if you have a Fab in the view, keep the below code and delete android:backgroundTint="@color/colorPrimary"
This solved the issue.

<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/list_fab_margin"
android:layout_marginTop="@dimen/list_fab_margin"
android:layout_marginEnd="@dimen/list_fab_margin"
android:layout_marginBottom="@dimen/list_fab_margin"
app:backgroundTint="@color/colorPrimary"
app:fabSize="mini"
app:srcCompat="@drawable/ic_edit"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="41dp"
tools:layout_editor_absoluteY="16dp" />