android.view.AbsSavedState$1 无法转换为 android.widget.CompoundButton$SavedState

android.view.AbsSavedState$1 cannot be cast to android.widget.CompoundButton$SavedState

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

Caused by java.lang.ClassCastException: android.view.AbsSavedState 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.access0(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 有关,但我在我的代码中找不到任何关于如何调试它的想法?

我还尝试在开发者选项中启用 "Dont keep activities" 以强制实例恢复,但我无法手动重现崩溃。

在没有看到代码和确切的情况下很难找到确切的问题 activity/fragment class 但可能有以下原因可以帮助您进行更多调试..

  1. 您可能在转换时匹配并创建内存泄漏的 id 或 View 名称重复。

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

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

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

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

Edit > Find > Find in Path ...使搜索更容易;

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

事实证明我正在使用新的 Chip 组件(扩展 CompoundButton),并且有一组没有 id 的芯片。

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

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

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