【问题标题】:TabWidget onClick after onSaveInstanceState (java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState)TabWidget onClick after onSaveInstanceState (java.lang.IllegalStateException: Can't perform this action after onSaveInstanceState)
【发布时间】:2012-08-15 19:14:45
【问题描述】:

我在片段兼容性包示例之后创建了一个片段选项卡小部件,我在onTabChanged 中更改了片段,但我有一些市场报告指出IllegalStateExceptiononSaveInstanceState 之后出现,这是由于向片段管理器请求提交引起的调用onSaveInstanceState() 后,如何在调用onSaveInstanceState 后接收performClick?

堆栈跟踪:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1325)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:532)
at my.app.NewsTab.onTabChanged(NewsTab.java:144)
at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:378)
at android.widget.TabHost.setCurrentTab(TabHost.java:363)
at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:149)
at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:559)
at android.view.View.performClick(View.java:3122)
at android.view.View$PerformClick.run(View.java:12012)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4126)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)

看起来这个问题以某种方式讨论过(通过搜索错误),但对我来说这只是一个副作用,一个支持错误?我还阅读了有关蜂窝 + 的不同应用程序生命周期的信息,但是在保存实例后执行单击对我来说看起来是不现实的行为

我应该在onSaveInstanceState 中使用commitAllowingStateLoss() 还是mTabHost.setOnClickListener(null)

很遗憾我无法重现,我只在开发者控制台上看到很少见的报告

活动有android:configChanges="orientation|screenLayout"

我也用“总是完成”测试了生命周期

标签片段切换器位于 ViewPager 内,但我怀疑是否相关

【问题讨论】:

  • 这也发生在我们身上,你找到原因了吗?
  • FWIW,一个指向我在下面提到的类似问题的链接:stackoverflow.com/q/19696501/642160——这至少可以让您对重现步骤有所了解。

标签: android tabs fragment


【解决方案1】:

这似乎是 Android 从 4.4 版到 5 版的错误。有关详细信息,请参阅此answer

【讨论】:

    【解决方案2】:

    onSaveInstanceState() 在 Activity 从前台消失后被调用。保存状态后你不能做任何事情。如果可以,请与我们分享您的代码以进行检查。您必须在调用onSaveInstanceState() 方法之前进行更改。

    【讨论】:

      【解决方案3】:

      问题是您在调用ActivityonSaveInstanceState() 方法后尝试提交FragmentTransaction。由于blog post 中描述的原因,这是不允许的。

      【讨论】:

      • 当然,但我的应用程序不应该处理onSaveInstanceState()之后的点击
      • 我的猜测是问题并没有在响应用户点击时发生。它更有可能发生在配置更改上,当用户单击主页按钮并且活动停止并可能被系统杀死等时。你知道具体什么时候抛出异常吗?你能自己重现错误吗?
      • 我无法直接复制,我只有在开发者控制台上得到报告(该应用已上市),活动使用示例“标签+滑动”,但在一种可能不是 100% 正确的方式,但无论我在那种状态下所做的点击事件看起来都是一个错误
      • onSaveInstanceState()Activity 进入后台之前立即被调用。换句话说,当onSaveInstanceState() 被调用时,用户界面将被隐藏,因此用户首先不应该能够点击事物。这就是为什么我认为问题与配置更改和/或Activity 生命周期中的一些棘手问题有关,而您没有考虑到这些问题......我认为这样的事情不可能发生在回应用户点击事件。
      • 我仍在寻找正确的答案,但我可以确认在 onSaveInstanceState 之后很可能获得 onClick。我有一个选项卡活动,托管片段活动,其中一些具有在其 onClick/onItemClick 中推送新片段的按钮或列表。如果您按住其中一个按钮,然后点击另一个选项卡,您将在 onSaveInstanceState 之后获得 onClick - 1.05 秒后,在我刚刚运行的测试中。
      猜你喜欢
      • 2019-05-03
      • 2022-02-09
      • 2013-12-19
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2020-03-19
      相关资源
      最近更新 更多