40

我的应用程序在商店里已经有一段时间了,但根据开发者控制台中的崩溃报告,它似乎偶尔会崩溃,说: 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任何地方被覆盖。谁能指出我有意义的方向?

4

8 回答 8

83

我以前见过与此类似的问题,这是因为您有两个共享相同名称的 id。

onRestoreInstanceState已执行该方法findViewById,但找到的第一个视图不是ProgressView.

仔细检查您的应用程序是否没有在两个不同的地方重用相同的 ID

于 2013-03-08T16:06:58.283 回答
9

我有一个不同的问题:在一个布局中,根是 ScrollView,而在另一个布局中,根是包含 ScrollView 的 RelativeView。所有小部件 id 都是相同的,并且没有重复。在轮换崩溃日志是:

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

一旦我匹配了布局(所以在两个根中都是RelativeLayout或ScrollView),旋转工作正常。

不知道为什么这会导致崩溃,所以任何见解都会受到赞赏......

于 2015-07-24T16:24:39.260 回答
3

就我而言,有两个具有相同 ID 的不同视图。其中一个在主布局中,另一个在主布局中作为视图包含的另一个布局中。我更改了其中一个 ID。

于 2019-11-10T10:33:20.737 回答
3

在我的情况下,我的肖像 xml 具有RelativelayoutScrollView来自具有相同 ID 的横向 xml。

在我的活动课上,我尝试膨胀布局并将其分配给ViewGroup

因此,当屏幕旋转发生时,它会抛出: java.lang.ClassCastException: android.view.AbsSavedState$1cannot be cast toandroid.widget.ScrollView$SavedState

这是因为ScrollView延伸FrameLayoutRelativelayout延伸ViewGroup

所以我只是用景观xml包装Relativelayout并解决了问题

于 2016-11-14T05:21:35.463 回答
1

当我在两种不同的布局(一种纵向和另一种横向)中有一个 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 对这个错误更加无情。

于 2016-01-29T16:22:00.677 回答
1

我需要使用具有相同 ID 的不同布局。所以,解决方法是

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    try {
        super.onRestoreInstanceState(savedInstanceState);
    } catch (Exception ignored) {
    }
}

这将使您的应用程序免于崩溃。

super.onRestoreInstanceState(savedInstanceState)只能执行到点异常发生。但是,我觉得它没有用,至少在我的应用程序中,所以我可以绕过onRestoreInstanceState.

于 2020-03-24T13:32:37.620 回答
0

您可以在某些情况下使用: isSaveEnabled = false 用于具有相同 id 的视图,以避免在恢复状态期间出错

于 2020-03-27T08:36:58.117 回答
0

它发生在我身上,<ProgressBar />带有android:id="@+id/progress"- 没有任何 id 值冲突。在我的应用程序之外猜测与具有此预定义值的现有视图有关。更改为android:id="@+id/progressBar"或任何解决问题的方法。

于 2021-10-11T16:42:28.297 回答