2015-05-31 14 views
28

Ho un probem strana utilizzando l'AppCompat Lib 22.2 con il nuovo introdotto: layout_behaviorUtilizzando AppCompat 'layout_behavior' con '@ string/appbar_scrolling_view_behavior' getta eccezione

se lo uso con il valore "@ string/appbar_scrolling_view_behavior" , come descritto qui Android Design Support Lib l'applicazione termina con la seguente eccezione:

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 

Se cambio a:

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

tutto funziona bene.

Cosa mi manca?

+0

Si sta utilizzando ProGuard? – ianhanniballake

+0

Ciao, no non sto usando proguard. Vedere il mio build.gradle: http://hastebin.com/funijokudi.vbs –

+0

Vergogna su di me. Devo esportare accidentalmente la stringa sul mio string.xml. –

risposta

55

Per gli altri che incontrano questa eccezione e utilizzare Proguard - è necessario aggiungere le seguenti regole: Proguard

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

o se non si desidera mantenere tutti dei componenti della libreria di progettazione che è possibile utilizzare:

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

L'ultima riga non è necessaria poiché verrà mantenuta dalla linea 2. –

+0

Un punto importante è forzare una ricostruzione della tua app. Sul mio sistema non sono state utilizzate le impostazioni di ProGuard aggiornate. –

1

Per devel opers che utilizzano questo errore solo quando si utilizza Proguard, è sufficiente aggiungere una sola riga per Proguard regole del file:

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

Un altro motivo per questo di accadere è quando si sta estendendo FloatingActionButton.Behavior e don avere un costruttore (Context, AttributeSet). Quello che è successo a me con la libreria di design v 23.0.1

Basta aggiungere questo costruttore per la sottoclasse:.

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

Ottima risposta, vale la pena notare che questo costruttore si applica a qualsiasi sottoclasse di CoordinatorLayout.Behavior; Ho avuto lo stesso problema con BottomSheetBehavior. – MattMatt

+0

penso che la super chiamata corrispondente al tuo consctructor sarebbe super (contesto, attrs); e non questo. – Ostkontentitan

+0

La versione della libreria di supporto di 'FloatingActionButton.Behavior' (almeno in 23.2.0 che sto attualmente utilizzando) non sovrascrive alcun costruttore, quindi quella senza parametri è l'unica disponibile. – fast3r

Problemi correlati