[英]Unexplainable ClassCastException in android.widget.ProgressBar.onRestoreInstanceState
我的應用程序已經在商店中有一段時間了,但根據開發者控制台中的崩潰報告,它似乎偶爾會崩潰,說: java.lang.ClassCastException in 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
這些崩潰的原因讓我難以理解,我無法在我的任何設備上重現它。 我也沒有在任何地方覆蓋onRestoreInstanceState
。 誰能指出我一個有意義的方向?
我以前見過類似的問題,這是因為您有兩個共享相同名稱的 ID。
onRestoreInstanceState
已經執行了findViewById
方法並且要找到的第一個視圖不是ProgressView
。
仔細檢查您的應用程序是否不會在兩個不同的地方重復使用相同的 ID
我有一個不同的問題:在一個布局中,根是一個 ScrollView,而在另一個布局中,根是一個包含 ScrollView 的 RelativeView。 所有小部件 ID 都相同,並且沒有重復項。 輪換時,崩潰日志是:
java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ScrollView$SavedState
一旦我匹配了布局(所以在根中要么是RelativeLayout要么是ScrollView),旋轉就可以正常工作了。
不知道為什么這會導致崩潰,所以任何見解將不勝感激......
在我的情況下,我的縱向 xml 具有來自具有相同 ID 的橫向 xml 的Relativelayout
和ScrollView
。
在我的活動課上,我嘗試擴大布局並將其分配給ViewGroup
所以當屏幕旋轉發生時它拋出: java.lang.ClassCastException: android.view.AbsSavedState$1
cannot be cast to android.widget.ScrollView$SavedState
這是因為ScrollView
擴展了FrameLayout
而Relativelayout
擴展了ViewGroup
所以我只是用Relativelayout
包裝景觀xml並解決問題
就我而言,有兩個具有相同 ID 的不同視圖。 其中一個位於主布局中,另一個位於主布局作為視圖包含的另一個布局中。 我更改了其中一個 ID。
當我在兩種不同的布局(一種縱向和另一種橫向)中使用 GridView 時,我在旋轉時收到此崩潰消息。 一個包含在 FrameLayout 中,另一個不包含,即,它單獨存在於布局文件中。 當我刪除包裝 FrameLayout 時,一切正常。 (注意:GridView 用於主/視圖布局的主端。)
直到我將 Gradle 設置升級到此消息后,該消息才出現:
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'
}
他們以前是這樣的:
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'
}
Marshmallow 似乎對這個錯誤更無情。
我需要使用具有相同 ID 的不同布局。 所以,解決方法是
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
try {
super.onRestoreInstanceState(savedInstanceState);
} catch (Exception ignored) {
}
}
這將避免您的應用程序崩潰。
super.onRestoreInstanceState(savedInstanceState)
只能執行到點異常發生。 但是,我覺得它沒有用,至少在我的應用程序中沒有用,所以我可以繞過onRestoreInstanceState
。
您可以在某些情況下使用: isSaveEnabled = false 用於具有相同 id 的視圖,以避免在恢復狀態期間出錯
它發生在我身上, <ProgressBar />
帶有android:id="@+id/progress"
- 沒有任何 id 值沖突。 在我的應用程序之外,猜測與具有此預定義值的現有視圖有關的事情。 更改為android:id="@+id/progressBar"
或任何解決問題的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.