Подтвердить что ты не робот

Unexplainable ClassCastException в 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. Может ли кто-нибудь указать мне направление, которое имеет смысл?

4b9b3361

Ответ 1

Я видел подобные проблемы ранее, и это потому, что у вас есть два идентификатора, которые имеют одно и то же имя.

onRestoreInstanceState выполнил метод findViewById, и первое найденное представление не было ProgressView.

Дважды проверьте, что ваше приложение не использует один и тот же идентификатор в двух разных местах.

Ответ 2

У меня была другая проблема: в одном макете root был ScrollView, а в другом корневой был RelativeView, содержащий ScrollView. Все идентификаторы виджетов были идентичны, и дубликатов не было. При повороте журнала сбоев было:

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

Как только я сопоставил макеты (так что в обоих корнях были либо RelativeLayout, либо ScrollView), вращение работало нормально.

Не уверен, почему это приведет к сбою, поэтому любые идеи будут оценены...

Ответ 3

В моем случае мой портрет xml имеет Relativelayout и ScrollView из ландшафтного xml с тем же идентификатором.

В моем классе активности я пытаюсь раздуть макет и назначить его на ViewGroup

Поэтому, когда происходит поворот экрана, он бросает: java.lang.ClassCastException: android.view.AbsSavedState$1 нельзя отнести к android.widget.ScrollView$SavedState

Это потому, что ScrollView расширяет FrameLayout, а Relativelayout расширяет ViewGroup

Итак, я просто обертываю ландшафт xml с помощью Relativelayout и решает проблему

Ответ 4

Я получил эту ошибку при вращении, когда у меня был 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'
}

Кажется, Зефир более неумолимый с этой ошибкой.