Andre Classen
Andre Classen

Reputation: 4007

Using AppCompat 'layout_behavior' with '@string/appbar_scrolling_view_behavior' throws exception

I have a strange probem using the AppCompat Lib 22.2 with the new introduced: layout_behavior

If i use it with the value "@string/appbar_scrolling_view_behavior" , as described here Android Design Support Lib the application terminates with the following exception:

Could not inflate Behavior subclass android.support.design.widget.Settings
     Caused by: java.lang.RuntimeException: Could not inflate Behavior subclass android.support.design.widget.Settings
     Caused by: java.lang.ClassNotFoundException: android.support.design.widget.Settings
     Caused by: java.lang.NoClassDefFoundError: android/support/design/widget/Settings
     Caused by: java.lang.ClassNotFoundException: android.support.design.widget.Settings

If i change to :

app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior"

everything works fine.

What i'm missing ?

Upvotes: 31

Views: 45089

Answers (5)

Rohit Sharma
Rohit Sharma

Reputation: 2679

I encountered this error today after migrating my project to Androidx.

It seems that I had a string in my string.xml file. I had to remove this line.

<string name="appbar_scrolling_view_behavior" translatable="false">android.support.design.widget.AppBarLayout$ScrollingViewBehavior</string>

It should only link to values.xml file and not string.xml file.

app:layout_behavior="@string/appbar_scrolling_view_behavior" should only link to values.xml (Ctrl+B)

<string name="appbar_scrolling_view_behavior" translatable="false">com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior</string>

Upvotes: 2

fast3r
fast3r

Reputation: 1308

Another reason for this to be happening is when you're extending FloatingActionButton.Behavior and you don't have a (Context, AttributeSet) constructor. That happened to me with design library v. 23.0.1

Just add this constructor to your subclass:

public FloatingActionButtonBehaviorSubclass(Context context, AttributeSet attrs) {
    super();
}

Upvotes: 37

Binoy Babu
Binoy Babu

Reputation: 17119

For developers who are using getting this error only when using proguard, just add a single line to proguard rules file :

-keep public class * extends android.support.design.widget.CoordinatorLayout$Behavior { *; }

Upvotes: 3

Nati Dykstein
Nati Dykstein

Reputation: 1290

For others who encounter this exception and use proguard - you need to add following proguard rules:

-keep class android.support.design.widget.** { *; }
-keep interface android.support.design.widget.** { *; }
-dontwarn android.support.design.**

or if you don't want to keep all of the design library components you can use:

-keepattributes *Annotation*
-keep public class * extends android.support.design.widget.CoordinatorLayout.Behavior { *; }
-keep public class * extends android.support.design.widget.ViewOffsetBehavior { *; }

Upvotes: 56

chenupt
chenupt

Reputation: 1781

You should add design lib for your project.

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

Check the sample https://github.com/chrisbanes/cheesesquare

Upvotes: 23

Related Questions