簡體   English   中英

android.widget.ProgressBar.onRestoreInstanceState 中無法解釋的 ClassCastException

[英]Unexplainable ClassCastException in 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 誰能指出我一個有意義的方向?

我以前見過類似的問題,這是因為您有兩個共享相同名稱的 ID。

onRestoreInstanceState已經執行了findViewById方法並且要找到的第一個視圖不是ProgressView

仔細檢查您的應用程序是否不會在兩個不同的地方重復使用相同的 ID

我有一個不同的問題:在一個布局中,根是一個 ScrollView,而在另一個布局中,根是一個包含 ScrollView 的 RelativeView。 所有小部件 ID 都相同,並且沒有重復項。 輪換時,崩潰日志是:

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

一旦我匹配了布局(所以在根中要么是RelativeLayout要么是ScrollView),旋轉就可以正常工作了。

不知道為什么這會導致崩潰,所以任何見解將不勝感激......

在我的情況下,我的縱向 xml 具有來自具有相同 ID 的橫向 xml 的RelativelayoutScrollView

在我的活動課上,我嘗試擴大布局並將其分配給ViewGroup

所以當屏幕旋轉發生時它拋出: java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ScrollView$SavedState

這是因為ScrollView擴展了FrameLayoutRelativelayout擴展了ViewGroup

所以我只是用Relativelayout包裝景觀xml並解決問題

就我而言,有兩個具有相同 ID 的不同視圖。 其中一個位於主布局中,另一個位於主布局作為視圖包含的另一個布局中。 我更改了其中一個 ID。

當我在兩種不同的布局(一種縱向和另一種橫向)中使用 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 似乎對這個錯誤更無情。

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

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

這將避免您的應用程序崩潰。

super.onRestoreInstanceState(savedInstanceState)只能執行到點異常發生。 但是,我覺得它沒有用,至少在我的應用程序中沒有用,所以我可以繞過onRestoreInstanceState

您可以在某些情況下使用: isSaveEnabled = false 用於具有相同 id 的視圖,以避免在恢復狀態期間出錯

它發生在我身上, <ProgressBar />帶有android:id="@+id/progress" - 沒有任何 id 值沖突。 在我的應用程序之外,猜測與具有此預定義值的現有視圖有關的事情。 更改為android:id="@+id/progressBar"或任何解決問題的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM