RuntimeException: Could not inflate Behavior subclass

Viewed 30910

I new in android and I've troubles with FloatingActionButton behaivors

My custom behavoir class:

public class ScrollingFABBehavior extends FloatingActionButton.Behavior {
    private static final String TAG = "ScrollingFABBehavior";

    public ScrollingFABBehavior(Context context, AttributeSet attrs,
            Handler mHandler) {
        super();
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout,
            FloatingActionButton child, View directTargetChild, View target,
            int nestedScrollAxes) {
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
                || super.onStartNestedScroll(coordinatorLayout, child,
                        directTargetChild, target, nestedScrollAxes);
    }

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout,
            FloatingActionButton child, View target, int dxConsumed,
            int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed,
                dyConsumed, dxUnconsumed, dyUnconsumed);
        if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
            child.hide();
        } else if (dyConsumed < 0 && child.getVisibility() == View.GONE) {
            child.show();
        }
    }

    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout,
            FloatingActionButton
            child, View target) {
        super.onStopNestedScroll(coordinatorLayout, child, target);
    }
}

Fragment XML:

...

<android.support.design.widget.FloatingActionButton
        android:id="@+id/share_fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:contentDescription="@string/action_share"
        android:elevation="@dimen/fab_elevation"
        android:src="@drawable/ic_share"
        app:layout_behavior=".ScrollingFABBehavior"/>

</android.support.design.widget.CoordinatorLayout>

RuntimeError when fragment inflate xml:

07-14 08:52:43.904 30785-30785/com.example.xyzreader E/AndroidRuntime: FATAL EXCEPTION: main
                                                                       Process: com.example.xyzreader, PID: 30785
                                                                       android.view.InflateException: Binary XML file line #115: Could not inflate Behavior subclass com.example.xyzreader.ui.ScrollingFABBehavior
                                                                       Caused by: java.lang.RuntimeException: Could not inflate Behavior subclass com.example.xyzreader.ui.ScrollingFABBehavior
                                                                           at android.support.design.widget.CoordinatorLayout.parseBehavior(CoordinatorLayout.java:615)
                                                                           at android.support.design.widget.CoordinatorLayout$LayoutParams.<init>(CoordinatorLayout.java:2652)

e.t.c

Whats wrong?

10 Answers

Make sure that you are using the absolute path instead of a relative path of the custom behavior class.

For example:

app:layout_behavior="net.company.myapp.view.behavior.TextViewBehavior"

If you are using AndroidX (open-source project that the Android team uses to develop, test, package, version and release libraries within Jetpack) then you need to update XML.

Find your element here and replace:

Support:

android.support.design.widget.FloatingActionButton

AndroidX:

com.google.android.material.floatingactionbutton.FloatingActionButton

If you are using BottomSheet in Android X you must use

app:layout_behavior="@string/bottom_sheet_behavior"

if not then use

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

In case your app has a different package ID than your actual package structure, make sure you specify the full path to your custom behavior class:

<android.support.design.widget.FloatingActionButton
        ...
        app:layout_behavior="com.example.xyzreader.ScrollingFABBehavior"/>

If you are working with androidX then your root layout should be:

<androidx.coordinatorlayout.widget.CoordinatorLayout

and bottom_sheet's layout should include:

app:layout_behavior="@string/bottom_sheet_behavior"

else if you are not using androidx or using support library then your root layout should be:

<android.support.design.widget.CoordinatorLayout

and bottom_sheet's layout should include:

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

I had a similar problem and ended up on this page.

I am working with Bottom Sheet on Android X

I ran my app and got the following error message when I tapped to move to a new Fragment in the app and the app crashed with a RuntimeExeception: "Could not inflate Behavior subclass com.google.android.material.bottomsheet.BottomSheetBehaviour"

My layout attributes were as follows:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/player_bg"
    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehaviour"
    app:behavior_hideable="true"
    app:behavior_peekHeight="70dp">

When I got that error message I changed one line and then the app worked.

As described above, as I am using Android X, i changed from:

app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehaviour"

I changed this line to:

app:layout_behavior="@string/bottom_sheet_behavior"

This one change meant that the code worked for me, no crash and the new Fragment showed up as expected.

If you are using the Androidx Jetpack dependencies then

replace

app:layout_behavior="android.support.design.widget.BottomSheetBehavior"

with

app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"

Make app theme into material components "parent="Theme.MaterialComponents.Light.NoActionBar" in theme.xml

Related