当前位置: 首页 > 知识库问答 >
问题:

屏幕关闭时的DialogFragment IllegalStateException

鲁展
2023-03-14

首先,我阅读了几十个SO问题,并阅读了Alex Lockwood撰写的关于与片段事务相关的illegalStateException问题的精彩文章:https://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html-tl;DR我做了功课

但我在任何地方都没有发现IllegalStateException问题,此时屏幕关闭,并且我们正在尝试提交片段事务-在我的例子中显示DialogFragment

在我的应用程序中发生的事情是对其他activity结果的反应,然后显示一个DialogFragment。正如许多SO用户所建议的,我不是从OnActivityResult显示对话框,而是从OnPoStresume(我也尝试过使用OnResumeFragments)显示简化代码如下所示

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    Timber.i("${this::class.java.simpleName} onActivityResult")
    activityResult = ActivityResult(this::class, requestCode, resultCode, data)
}

override fun onPostResume() {
    super.onPostResume()
    Timber.i("${this::class.java.simpleName} onPostResume")
    activityResult?.let { ActivityResultRepository.resultsSubject.onNext(it) }
}

override fun onResumeFragments() {
    super.onResumeFragments()
    Timber.i("${this::class.java.simpleName} onResumeFragments")
}

我无法在我的设备(Mate 20 pro)或模拟器上复制异常,但我收到了来自我应用程序用户的崩溃报告(0.5%的用户受到影响)

我的假设是,我的应用程序试图在屏幕关闭后显示一个对话框。屏幕关闭是导致调用OnSaveInstanceState方法的任意事件,它可以在我的OnPoStreSume方法之前调用。不过,这只是我的假设!也许是另一个原因造成的例外

有没有人经历过类似的问题并设法处理?我知道我可以使用CommitAllowingStateLoss,但首先,DialogFragment的-show方法不允许这样做,必须使用FragmentManager手动显示对话框(不知道是否有任何含义),其次,CommitAllowingStateLoss通常是一件不好的事情

我正在添加崩溃报告,尽管每个人都在某个地方看到了它:)

Caused by java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
       at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:2053)
       at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2079)
       at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:678)
       at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:632)
       at android.support.v4.app.DialogFragment.show(DialogFragment.java:143)

共有1个答案

田嘉澍
2023-03-14

这种事经常发生。activity得状态不正确,无法显示对话框.你可以用这个来保护自己:

if (!isFinishing() && !isDestroyed()) {
    dialog.show();
}
 类似资料:
  • 关闭屏幕盖时   设定关闭屏幕盖时的动作。 标准 关闭屏幕盖时,显示专用的画面。 进入睡眠模式 让主机进入睡眠模式。 提示 若主机处于锁定状态(POWER(电源)/HOLD(固定)按钮滑至下方),即使已选择[进入睡眠模式],主机仍不会在关闭屏幕盖时进入睡眠模式。 屏幕盖关闭时显示的画面 在屏幕盖关闭时按下L/R按钮,即可变更显示的内容。 同时按下L/R按钮 每次同时按下L/R按钮,可交替显示月历/

  • 我正在使用AccessibilityService OnKeyEvent捕获HeadSetHook。这是这样的,我可以触发一个事件上键,下键,即使我的应用程序它不在焦点。 但是,一旦屏幕熄灭,它就不起作用了。这有什么办法吗?

  • 在我的应用程序中,我有多个.fxml文件。当我在应用程序中设置屏幕时,我还设置了<code>SetOnCloseRequest()管理银行屏幕后不久,应用程序并没有停止运行。所以在那之后我什么都做不了,因为我没有GUI。是否有人知道如何确保屏幕不会关闭? 下面是我的带有< code>SetOnCloseRequest()方法的主类: 这是我的类:

  • 我正在开发一个应用程序,我想在屏幕上显示计时器,并用它做动作。我需要当计时器停止时,玩家会输掉比赛。这部分我可以单独做,但我不知道如何做的部分是如何在屏幕上显示计时器,并使剩余的时间可见。 我希望你能帮助我,谢谢你的帮助!

  • 我正在使用在线程上运行的 SurfaceView 类中的画布。SurfaceView 由 Activity (setContentView(surfaceview)) 调用。当屏幕关闭时,它会通过一个 pause() 方法关闭所有循环变量等。 奇怪的是:虽然在我的平板电脑(Android 4.4.2)线程暂停和恢复正确(线程重新开始),但是在我的手机(Android 4.2.2)和其他人的手机(C

  • 对于这个问题,我将引用另一个没有得到回答的用户的话: 我自己正在开发一个利用音量按钮的应用程序,但正如这位用户也指出的那样,一旦屏幕关闭,用onKeyPress检查按钮的正常行为就会停止工作。这是因为活动在屏幕上暂停。 有没有办法在屏幕关闭时保持活动运行,或者在屏幕关闭时检查音量按钮的使用情况?我以前尝试过为此使用一个服务,但无法检查像CommonSware所指出的那样的音量键。