2013-03-08 32 views
28

Tôi đã có ứng dụng của mình trong cửa hàng một thời gian, nhưng có vẻ như thỉnh thoảng nó bị treo theo báo cáo sự cố trong Developer Console, nói: java.lang.ClassCastException in android.widget.ProgressBar.onRestoreInstanceState với ngăn xếp dấu vết:Không thể giải thích ClassCastException trong android.widget.ProgressBar.onRestoreInstanceState

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.myapp/com.mycompany.myapp.activity.MyActivity}: java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ProgressBar$SavedState 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1996) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2023) 
at android.app.ActivityThread.access$600(ActivityThread.java:127) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1174) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4503) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ProgressBar$SavedState 
at android.widget.ProgressBar.onRestoreInstanceState(ProgressBar.java:1093) 
at android.view.View.dispatchRestoreInstanceState(View.java:9975) 
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2408) 
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2408) 
at android.view.View.restoreHierarchyState(View.java:9951) 
at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1611) 
at android.app.Activity.onRestoreInstanceState(Activity.java:908) 
at android.app.Activity.performRestoreInstanceState(Activity.java:880) 
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1102) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) 
... 11 more 

Lý do cho các sự cố này khiến tôi không thể sao chép trên bất kỳ thiết bị nào của tôi. Tôi không có một số onRestoreInstanceState được ghi đè ở bất kỳ đâu. Bất cứ ai có thể chỉ cho tôi theo một hướng có ý nghĩa?

+0

Bạn có thể đăng thông tin thiết bị mà bạn có? – petey

Trả lời

61

Tôi đã gặp sự cố tương tự với vấn đề này trước đây và bởi vì bạn có hai id có cùng tên.

onRestoreInstanceState đã thực hiện phương thức findViewById và chế độ xem đầu tiên được tìm thấy không phải là ProgressView.

Đôi kiểm tra xem ứng dụng của bạn không tái sử dụng cùng một ID ở hai nơi khác nhau

+0

Với hai địa điểm khác nhau mà bạn muốn nói trong tất cả các chế độ xem được sử dụng trong hoạt động này? – MrJre

+0

Có, rất có thể là bạn đang sao chép id trong hoạt động. Nếu bạn đăng bố cục xml của mình ở trên, tôi có thể giúp chẩn đoán sự cố tốt hơn. – jimmithy

+0

Tôi không sử dụng XML nhiều, về cơ bản tôi chỉ đặt id để bố cục một số chế độ xem trong 'RelativeLayout'. Tôi đoán tôi sẽ phải đảm bảo không có hai lượt xem nào có cùng một Id; Tôi sẽ quay lại đây. – MrJre

7

Tôi đã có một vấn đề khác nhau: Trong một bố cục gốc là một scrollview trong khi ở bên kia gốc là một RelativeView có chứa các scrollview . Tất cả các id tiện ích con đều giống nhau và không có bản sao. Mở xoay nhật ký sự cố là:

java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ScrollView$SavedState 

Khi tôi phù hợp bố trí (như vậy trong cả gốc là một trong hai RelativeLayout hoặc scrollview), luân chuyển làm việc tốt.

Không chắc tại sao điều này sẽ gây ra một vụ tai nạn vì vậy bất kỳ hiểu biết sâu sắc sẽ được đánh giá ...

1

tôi Thông tin về vụ tai nạn này trên luân chuyển khi tôi đã có một GridView trong hai bố trí khác nhau, một bức chân dung và phong cảnh khác. Một cái được chứa trong một FrameLayout và cái còn lại thì không, nghĩa là nó nằm trong tập tin layout. Khi tôi gỡ bỏ gói FrameLayout, mọi thứ đều hoạt động tốt. (Lưu ý: GridView được sử dụng trên mặt bậc thầy của một bậc thầy/xem bố trí.)

Thông điệp đã không xuất hiện cho đến khi tôi nâng cấp các thiết lập Gradle của tôi như thế này:

android { 
    compileSdkVersion 23 
    buildToolsVersion '23.0.2' 
    defaultConfig { 
     applicationId 'com.example.android.redacted.app' 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:23.1.1' 

} 

Họ trước đây này:

android { 
    compileSdkVersion 21 
    buildToolsVersion '21.1.2' 
    defaultConfig { 
     applicationId 'com.example.android.redacted.app' 
     minSdkVersion 11 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 
    } 


dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:21.0.2' 
} 

Có vẻ như Marshmallow là không tha thứ hơn với lỗi này.

2

Trong trường hợp của tôi, xml của tôi có RelativelayoutScrollView từ xml ngang với cùng một ID.

Mở lớp hoạt động của tôi, tôi cố gắng thổi phồng cách bố trí và gán nó vào ViewGroup

Vì vậy, khi xoay màn hình xảy ra nó ném: java.lang.ClassCastException: android.view.AbsSavedState$1 không thể được đúc để android.widget.ScrollView$SavedState

Đó là bởi vì ScrollView kéo dài FrameLayout khi Relativelayout mở rộng ViewGroup

Vì vậy, tôi chỉ cần bọc cảnh quan xml với Relativelayout và giải quyết sự cố

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