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

时间:2015-03-10 10:23:43

标签: android memory-management android-actionbar

我的应用在从背景到前景时经常崩溃。 Scenerio:假设我玩任何游戏,我的应用程序在最近的列表中,在播放后,如果我选择应用程序,它将崩溃并显示错误。我的应用中没有工具栏,只使用了操作栏。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fcords.android/com.fcords.android.Home.HomeScreen.HomePage_New}: java.lang.ClassCastException: android.view.AbsSavedState$1 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.access$800(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$1 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)

有人面对这个问题吗?先谢谢。

4 个答案:

答案 0 :(得分:17)

在我的案例中修复了问题:

我的案例中的问题是:

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

ie:在我的情况下,我有一个名为" action_bar.xml"的自定义操作栏布局。和另一个布局中的ID为" + id / action_bar"。这会导致应用程序不在内存中并重新创建该页面时出现问题。

注意:不要多次使用相同的ID /布局名称。

答案 1 :(得分:2)

在这种边缘情况下也会发生这种情况:

如果在具有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);

答案 2 :(得分:0)

在我的情况下,我在屏幕上的布局中包含ChipGroup和没有ID的芯片。然后,如果我从其他屏幕返回此屏幕-我收到此错误“ java.lang.ClassCastException:android.view.AbsSavedState $ 1无法转换为android.widget.CompoundButton $ SavedState”。 因此,只需将id添加到芯片上,一切正常。

答案 3 :(得分:0)

就我而言,我已经创建了几个自定义组件,例如下拉菜单,Textinput等。它们都具有与相同标题(必填符号)相同的结构。所有的id都是相同的,由于它们采用不同的布局,因此目前不是什么大问题。

但随后恰好发生此错误

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

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