android.widget.ProgressBar.onRestoreInstanceState 中无法解释的 ClassCastException
Posted
技术标签:
【中文标题】android.widget.ProgressBar.onRestoreInstanceState 中无法解释的 ClassCastException【英文标题】:Unexplainable ClassCastException in android.widget.ProgressBar.onRestoreInstanceState 【发布时间】:2013-02-24 05:52:26 【问题描述】:我的应用程序在商店里已经有一段时间了,但根据开发者控制台中的崩溃报告,它似乎偶尔会崩溃,说:
java.lang.ClassCastException in android.widget.ProgressBar.onRestoreInstanceState
带有堆栈跟踪:
java.lang.RuntimeException: Unable to start activity ComponentInfocom.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
。谁能给我指出一个有意义的方向?
【问题讨论】:
您能发布您拥有的设备信息吗? 这有助于测试:***.com/a/19622671 【参考方案1】:我以前见过类似的问题,这是因为你有两个同名的 id。
onRestoreInstanceState
执行了findViewById
方法,找到的第一个视图不是ProgressView
。
仔细检查您的应用程序没有在两个不同的地方重复使用相同的 ID
【讨论】:
您是指在活动中使用的所有视图中的两个不同位置? 是的,您可能在活动中复制了 id。如果您在上面发布您的 xml 布局,我可能能够更好地帮助诊断问题。 我不经常使用 XML,我基本上只设置 id 来在RelativeLayout
中布局一些视图。我想我只需要确保没有两个视图具有相同的 ID;我会回到这个。
不管怎样,我通常解决这个问题的方法是创建一个名为 ids 的资源文件,然后为我在代码中创建的每个小部件分配一个预定义的 id。 developer.android.com/guide/topics/resources/…
还要检查 ID 在横向布局和纵向布局中的定义是否不同。【参考方案2】:
我有一个不同的问题:在一个布局中,根是 ScrollView,而在另一个布局中,根是包含 ScrollView 的 RelativeView。所有小部件 id 都是相同的,并且没有重复。在轮换时,崩溃日志是:
java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ScrollView$SavedState
一旦我匹配了布局(所以在两个根中都是RelativeLayout 或ScrollView),旋转工作正常。
不知道为什么这会导致崩溃,所以任何见解都将不胜感激......
【讨论】:
【参考方案3】:在我的情况下,我的纵向 xml 具有来自具有相同 ID 的横向 xml 的 Relativelayout
和 ScrollView
。
在我的活动课上,我尝试扩大布局并将其分配给ViewGroup
所以当屏幕旋转发生时,它会抛出:
java.lang.ClassCastException: android.view.AbsSavedState$1
不能转换为 android.widget.ScrollView$SavedState
这是因为ScrollView
扩展了FrameLayout
而Relativelayout
扩展了ViewGroup
所以我只是用Relativelayout
包装景观xml 并解决问题
【讨论】:
【参考方案4】:在我的例子中,有两个不同的视图具有相同的 ID。其中一个在主布局中,另一个在主布局中作为视图包含的另一个布局中。我更改了其中一个 ID。
【讨论】:
【参考方案5】:当我在两种不同布局(一种纵向和另一种横向)中有一个 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 对这个 bug 更加无情。
【讨论】:
【参考方案6】:我需要使用具有相同 ID 的不同布局。所以,解决方法是
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
try
super.onRestoreInstanceState(savedInstanceState);
catch (Exception ignored)
这将使您的应用程序免于崩溃。
super.onRestoreInstanceState(savedInstanceState)
只能执行到点异常发生。但是,我觉得它没有用,至少在我的应用程序中是这样,所以我可以绕过onRestoreInstanceState
。
【讨论】:
【参考方案7】:您可以在某些情况下使用:isSaveEnabled = false 用于具有相同 id 的视图,以避免在恢复状态期间出错
【讨论】:
【参考方案8】:<ProgressBar />
和 android:id="@+id/progress"
发生在我身上——没有任何 id 值冲突。在我的应用程序之外猜测与具有此预定义值的现有视图有关。更改为 android:id="@+id/progressBar"
或任何解决问题的方法。
【讨论】:
以上是关于android.widget.ProgressBar.onRestoreInstanceState 中无法解释的 ClassCastException的主要内容,如果未能解决你的问题,请参考以下文章