android.widget.ProgressBar.onRestoreInstanceState中无法解释的ClassCastException

时间:2013-03-08 16:03:11

标签: android android-widget

我已经将我的应用程序在商店中存放了一段时间,但根据开发者控制台中的崩溃报告,它似乎偶尔会崩溃,并说: 带有堆栈跟踪的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。有人能指出我有道理的方向吗?

7 个答案:

答案 0 :(得分:71)

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

onRestoreInstanceState执行了findViewById方法,找到的第一个视图不是ProgressView

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

答案 1 :(得分:9)

我有一个不同的问题:在一个布局中,根是ScrollView,而在另一个布局中,根是包含ScrollView的RelativeView。所有小部件ID都是相同的,没有重复。在旋转时,崩溃日志为:

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

一旦我匹配布局(因此在根中都是RelativeLayout或ScrollView),旋转工作正常。

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

答案 2 :(得分:2)

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

在我的活动课上,我尝试对布局进行充气并在ViewGroup

上进行分配

因此,当屏幕旋转发生时,它会抛出: java.lang.ClassCastException: android.view.AbsSavedState$1无法投放到android.widget.ScrollView$SavedState

这是因为ScrollView延伸FrameLayoutRelativelayout延伸ViewGroup

所以我只使用Relativelayout包装横向xml并解决问题

答案 3 :(得分: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'
}

看来棉花糖对这个虫子更加无情。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

这将防止您的应用程序崩溃。

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

答案 6 :(得分:0)

在某些情况下可以使用:isSaveEnabled = false(用于具有相同ID的视图),以避免在还原状态期间出错