java.lang.ClassCastException: android.view.AbsSavedState$1 无法转换为 android.support.v7.widget.Toolbar$SavedState

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

我的应用程序从后台转到前台时经常崩溃。 Scenerio:假设我正在玩任何游戏并且我的应用程序在最近的列表中并且玩完后,如果我选择应用程序,它会崩溃并显示错误。我的app没有toolbar,我用的只有actionbar

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fcords.android/com.fcords.android.Home.HomeScreen.HomePage_New}: java.lang.ClassCastException: android.view.AbsSavedState cannot be cast to android.support.v7.widget.Toolbar$SavedState
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
        at android.app.ActivityThread.access0(ActivityThread.java:148)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5312)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
 Caused by: java.lang.ClassCastException: android.view.AbsSavedState cannot be cast to android.support.v7.widget.Toolbar$SavedState
        at android.support.v7.widget.Toolbar.onRestoreInstanceState(Toolbar.java:1048)
        at android.view.View.dispatchRestoreInstanceState(View.java:13639)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2889)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2895)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2895)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2895)
        at android.view.View.restoreHierarchyState(View.java:13617)
        at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1982)
        at android.app.Activity.onRestoreInstanceState(Activity.java:1032)
        at android.app.Activity.performRestoreInstanceState(Activity.java:987)
        at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1184)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2287)

有人遇到过这个问题吗?提前致谢。

我的问题已解决:

我的问题是:

1:我在 xml 中有一个与布局同名的 ID。

即:在我的例子中,我有一个名为 "action_bar.xml" 的自定义操作栏布局,另一个布局中的 ID 为“+id/action_bar”。所以当应用程序不在时,这会导致问题内存并在重新创建该页面时。

注意:请勿在应用程序中多次使用相同的 ID/LAYOUT 名称。

在这种极端情况下也可能发生这种情况:

如果您在另一个具有 AttributeSet 参数的父视图的构造函数中以编程方式创建自定义视图:

   public ToggleButtonDescriptive(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.toggleButton = new SquareToggleButton(ctx, attributeSet);
    }

不要 将 AttributeSet 传递给该子视图:

toggleButton = new SquareToggleButton(ctx, attributeSet);

由于传递 AttributeSet 会导致子视图与父视图具有相同的 ID,因此 Android 会尝试将父 SavedState 恢复到该子视图,反之亦然。而是完全省略 AttributeSet 参数,如下所示:

toggleButton = new SquareToggleButton(ctx);

在我的例子中,我的屏幕布局有 ChipGroup 和没有 id 的芯片。然后,如果我 return 从其他屏幕转到此屏幕 - 我收到此错误 "java.lang.ClassCastException: android.view.AbsSavedState cannot be cast to android.widget.CompoundButton$SavedState"。 所以只需将 id 添加到芯片,一切正常。

在我的案例中,我创建了几个自定义组件,例如drop drow、Textinput 等。所有这些组件都具有一些相同的结构,如相同的标题、必填符号。所有的 ID 都是相同的,目前这不是一个大问题,因为它们处于不同的布局中。

但是后来正好出现这个错误

java.lang.ClassCastException: android.view.View$BaseSavedState cannot be cast to androidx.appcompat.widget.AppCompatSpinner$SavedState

然后我将所有自定义组件的内部组件 ID 更改为不同的。然后问题就解决了。