将 DialogFragment 保持在所有活动的前面(即使是在显示 DialogFragment 之后创建的活动)

Keep DialogFragment in front of all activities(even the ones created after showing the DialogFragment )

我有一个 DialogFragment 在某些情况下显示,它表示解锁应用程序访问权限的 pin 请求。

在我的应用程序中有一个场景,我启动了一个 activity,如果满足某些条件,它会显示 DialogFragment(从 BaseActivity 启动)请求 pin,但与此同时Activity A 开始另一个 Activity B,然后 DialogFragment 落后。

事件的顺序是

1- ActivityA is started

2- DialogFragment is shown

3- ActivityA starts ActivityB, and DialogFragment gets behind.

我想将 DialogFragment 保留在所有内容的前面,即使在片段出现后启动了新的 activity。

companion object {
    fun newInstance(cancelable: Boolean = false): LockCodeFragment {
        val frag = PinCodeFragment()
        frag.isCancelable = cancelable
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            frag.dialog?.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY)
            frag.dialog?.window?.setFlags(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY)
        } else {
            frag.dialog?.window?.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
            frag.dialog?.window?.setFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
        }
        return frag
    }

当我实例化片段时,我尝试将对话框设置为具有类型系统警报或应用程序覆盖,但没有成功。

有没有办法让 DiaglogFragment 在所有内容的前面?

  1. 创建一个 BaseActivity。
  2. 在 BaseActivity 中添加对话框显示条件
  3. 使用 BaseActivity 扩展所有其他 activity。
  4. 防止对话框关闭如下

要防止对话框在按下后退键时消失,请使用此

dialog.setCancelable(false);

并且要防止对话框在外部触摸时被关闭,请使用此

dialog.setCanceledOnTouchOutside(false);
view.bringToFront()

使视图出现在前面

正如我在评论中所述,据我所知这是不可能的,因为片段由 FragmentManager 管理,每个 Activity 都是唯一的。我认为你能做的最好的事情就是记住该片段是否显示在某处(使用 SharedPreferences 甚至是 Application 子类中的一个字段)然后,当另一个 activity 开始时,检查该值可能会再次显示对话框。