【问题标题】:android.view.AbsSavedState$1 cannot be cast to android.widget.CompoundButton$SavedStateandroid.view.AbsSavedState$1 不能转换为 android.widget.CompoundButton$SavedState
【发布时间】:2018-10-01 13:04:41
【问题描述】:

我在 Crashlytics 上经常看到以下错误:

Caused by java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.CompoundButton$SavedState
       at android.widget.CompoundButton.onRestoreInstanceState(CompoundButton.java)
       at android.view.View.dispatchRestoreInstanceState(View.java)
       at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java)
       at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java)
       at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java)
       at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java)
       at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java)
       at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java)
       at android.view.View.restoreHierarchyState(View.java)
       at android.support.v4.app.Fragment.restoreViewState(Fragment.java:494)
       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1486)
       at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
       at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
       at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
       at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:2466)
       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1483)
       at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
       at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
       at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
       at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
       at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:620)
       at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java)
       at android.app.Activity.performStart(Activity.java)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)
       at android.app.ActivityThread.access$900(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
       at android.os.Handler.dispatchMessage(Handler.java)
       at android.os.Looper.loop(Looper.java)
       at android.app.ActivityThread.main(ActivityThread.java)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)

但是,这个堆栈跟踪没有说明我的代码库,因为异常是在平台级别引发的。

从我读到的内容来看,这可能与重复的 id 有关,但我在我的代码中找不到任何关于如何调试它的想法?

我还尝试在开发者选项中启用“不保留活动”以强制实例恢复,但我无法手动重现崩溃。

【问题讨论】:

  • onStart 中有一个活动恢复了一个片段。你有包含RadioButtonCheckboxSwitchToggleButton的片段吗?如果是这样,请尝试在此处放置断点并检查Watches window,如果您没有错误地转换它们。
  • 您的项目是否有任何从CompoundButton(或其子类之一)派生的自定义View 子类?
  • 如果可能,尝试使用重现您的问题的相同设备,并尝试在您的应用位于前面的不同时刻切换应用程序(尤其是在使用 CompoundButton 片段的视图上),然后切换回你的应用程序。从保存状态恢复视图时,似乎出现了问题,但再现可能是特定于设备的。
  • 这可能是由于横向和纵向模式之间布局的结构变化而发生的。

标签: android fragmentmanager


【解决方案1】:

如果没有看到代码和确切的活动/片段类,这很难得到确切的问题,但可能有以下原因可以帮助您进行更多调试..

  1. 您的 id 或 View 的名称可能重复,在转换时会造成内存泄漏。

  2. CompoundButton 可能导入错误,可能是您正在使用自定义视图或版本影响。

【讨论】:

    【解决方案2】:

    结果我正在使用新的 Chip 组件(扩展 CompoundButton),并且有一组带有没有 id 的芯片。

    这会以某种方式导致应用在旧手机(Android 6)上崩溃,因为我只能猜测为多个芯片分配了相同的 ID。

    我移除了那个芯片(无论如何都没有必要),它不再崩溃了。

    【讨论】:

      【解决方案3】:

      这可能是由具有相同 resId 的视图引起的,作为包含布局的名称(主要原因)。

      它也可能是由重复的resIds 视图引起的,但这不太可能是原因。

      查看建议的所有片段 XML(很难判断是哪一个导致的)。

      但是Edit > Find > Find in Path ...使得搜索事件变得容易;

      依次搜索一个布局的名称;然后搜索视图的resId

      【讨论】:

        【解决方案4】:

        就我而言,我从所有包含的布局中删除了滚动视图。

        【讨论】:

          猜你喜欢
          • 2015-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-26
          • 2019-04-16
          • 2018-02-10
          • 2023-03-22
          相关资源
          最近更新 更多