2015-05-31 24 views
28

Tôi có một probem lạ bằng cách sử dụng AppCompat Lib 22.2 với giới thiệu mới: layout_behaviorSử dụng AppCompat 'layout_behavior' với '@ chuỗi/appbar_scrolling_view_behavior' ném ngoại lệ

Nếu tôi sử dụng nó với giá trị "@ string/appbar_scrolling_view_behavior" , như mô tả ở đây Android Design Support Lib ứng dụng chấm dứt với ngoại lệ sau:

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 

Nếu tôi thay đổi để:

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

mọi thứ hoạt động tốt.

Tôi đang thiếu gì?

+0

Bạn đang sử dụng ProGuard? – ianhanniballake

+0

Xin chào, tôi không sử dụng proguard. Xem build.gradle của tôi: http://hastebin.com/funijokudi.vbs –

+0

Xấu hổ với tôi. Tôi phải vô tình exportet chuỗi vào string.xml của tôi. –

Trả lời

55

Đối với những người khác gặp phải ngoại lệ này và sử dụng Proguard - bạn cần phải thêm các quy tắc Proguard sau:

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

hoặc nếu bạn không muốn giữ lại tất cả của các thành phần thư viện thiết kế mà bạn có thể sử dụng:

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

Dòng cuối cùng là không cần thiết vì nó sẽ được giữ bằng dòng 2. –

+0

Một điểm quan trọng là buộc xây dựng lại ứng dụng của bạn. Trên hệ thống của tôi, các cài đặt ProGuard đã cập nhật không được sử dụng. –

1

Để phát triển opers người đang sử dụng nhận được lỗi này chỉ khi sử dụng Proguard, chỉ cần thêm một dòng duy nhất để Proguard quy tắc tập tin:

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

Một lý do cho điều này để thể xảy ra là khi bạn đang mở rộng FloatingActionButton.Behavior và bạn don không có một hàm tạo (Context, AttributeSet). Đã xảy ra với tôi với thư viện thiết kế v 23.0.1

Chỉ cần thêm constructor này để phân lớp của bạn:.

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

Câu trả lời hay, cũng đáng chú ý là hàm tạo này áp dụng cho bất kỳ lớp con nào của CoordinatorLayout.Behavior; Tôi đã gặp vấn đề tương tự với BottomSheetBehavior. – MattMatt

+0

tôi nghĩ rằng các cuộc gọi siêu tương ứng với consctructor của bạn sẽ là siêu (bối cảnh, attrs); và không phải cái này. – Ostkontentitan

+0

Phiên bản thư viện hỗ trợ của 'FloatingActionButton.Behavior' (ít nhất là trong 23.2.0 mà tôi hiện đang sử dụng) không ghi đè bất kỳ hàm tạo nào, do đó, tham số không có sẵn là chỉ có sẵn. – fast3r

Các vấn đề liên quan