I've had my application out in the store for a while, but it seems it crashes occasionally according to the crash reports in the Developer Console, saying: java.lang.ClassCastException in android.widget.ProgressBar.onRestoreInstanceState
with the stack trace:
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
The reason for these crashes eludes me, and I can't reproduce it on any of my devices. I don't have a onRestoreInstanceState
overridden anywhere either. Can anyone point me in a direction that makes sense?
I've seen similar issues to this before, and it's because you have two id's that share the same name.
The onRestoreInstanceState
has performed the findViewById
method and the first view to be found was not the ProgressView
.
Double check that your application does not reuse the same ID in two different places
I had a different issue: In one layout the root was a ScrollView while in the other the root was a RelativeView that contained the ScrollView. All widgets ids were identical and there were no duplicates. On rotate the crash log was:
java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ScrollView$SavedState
Once I matched the layouts (so in both the root was either the RelativeLayout or ScrollView), the rotation worked fine.
Not sure why this would cause a crash so any insights would be appreciated...
In my case my portrait xml has Relativelayout
and ScrollView
from landscape xml with the same ID.
On my activity class I try to inflate the layout and assign it on ViewGroup
So when screen rotation occur it throws: java.lang.ClassCastException: android.view.AbsSavedState$1
cannot be cast to android.widget.ScrollView$SavedState
It's because the ScrollView
extends FrameLayout
while Relativelayout
extends ViewGroup
So i just wrap the landscape xml with Relativelayout
and solves the problem
In my case there were two different views with same id. One of them in the main layout and the other was in another layout included by the main layout as a view. I changed one of the ids.
I got this crash messsage on rotation when I had a GridView in two different layouts, one portrait and the other landscape. One was contained in a FrameLayout and the other was not, ie, it was by itself in the layout file. When I removed the wrapping FrameLayout, everything worked fine. (Note: the GridView was used on the master side of a master/view layout.)
The message did not appear until I upgraded my Gradle settings to this:
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'
}
They were previously this:
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'
}
It seems Marshmallow is more unforgiving with this bug.
I needed to use different layouts with same Id. So, the work around is
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
try {
super.onRestoreInstanceState(savedInstanceState);
} catch (Exception ignored) {
}
}
This will save your application from crashing.
super.onRestoreInstanceState(savedInstanceState)
may be executed only till the point exception occurs. However, I don't find it useful, at least in my apps, so I can afford to bypass onRestoreInstanceState
.
您可以在某些情况下使用: isSaveEnabled = false 用于具有相同 id 的视图,以避免在恢复状态期间出错
It happened to me with a <ProgressBar />
with android:id="@+id/progress"
- without any id value clash. Guess something to do with an existing view with this predefined value, outside my app. Changing to android:id="@+id/progressBar"
or whatever workarounds the problem.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.