将 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
在所有内容的前面?
- 创建一个 BaseActivity。
- 在 BaseActivity 中添加对话框显示条件
- 使用 BaseActivity 扩展所有其他 activity。
- 防止对话框关闭如下
要防止对话框在按下后退键时消失,请使用此
dialog.setCancelable(false);
并且要防止对话框在外部触摸时被关闭,请使用此
dialog.setCanceledOnTouchOutside(false);
view.bringToFront()
使视图出现在前面
正如我在评论中所述,据我所知这是不可能的,因为片段由 FragmentManager
管理,每个 Activity 都是唯一的。我认为你能做的最好的事情就是记住该片段是否显示在某处(使用 SharedPreferences
甚至是 Application
子类中的一个字段)然后,当另一个 activity 开始时,检查该值可能会再次显示对话框。
我有一个 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
在所有内容的前面?
- 创建一个 BaseActivity。
- 在 BaseActivity 中添加对话框显示条件
- 使用 BaseActivity 扩展所有其他 activity。
- 防止对话框关闭如下
要防止对话框在按下后退键时消失,请使用此
dialog.setCancelable(false);
并且要防止对话框在外部触摸时被关闭,请使用此
dialog.setCanceledOnTouchOutside(false);
view.bringToFront()
使视图出现在前面
正如我在评论中所述,据我所知这是不可能的,因为片段由 FragmentManager
管理,每个 Activity 都是唯一的。我认为你能做的最好的事情就是记住该片段是否显示在某处(使用 SharedPreferences
甚至是 Application
子类中的一个字段)然后,当另一个 activity 开始时,检查该值可能会再次显示对话框。