【问题标题】:Showing BottomSheetDialogFragment in immersive mode以沉浸式模式显示 BottomSheetDialogFragment
【发布时间】:2019-10-22 13:37:18
【问题描述】:

我想在沉浸式模式中显示一个 BottomSheetDialogFragment。最初,导航和状态栏会在显示对话框时显示,但我可以使用下面的代码对其进行排序。但是,当显示或关闭对话框时,导航栏会闪烁片刻。有没有一种方法可以完全沉浸式地显示 BottomSheetDialogFragment,而导航栏不会在显示和关闭时闪烁?

abstract class ImmersiveBottomSheetDialogFragment<T : ViewDataBinding> : BottomSheetDialogFragment() {

    protected lateinit var binding: T

    private val systemUiVisibility: Int = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            or View.SYSTEM_UI_FLAG_FULLSCREEN
            or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)

    fun showImmersive(
        fragmentManager: FragmentManager,
        tag: String,
        tapOutsideEnabled: Boolean = false
    ) {
        show(fragmentManager, tag)
        fragmentManager.executePendingTransactions()
        dialog?.let { dialog ->
            dialog.setCanceledOnTouchOutside(tapOutsideEnabled)
            dialog.window?.let { window ->
                window.decorView.systemUiVisibility = systemUiVisibility
                window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
            }
        }
    }
}

【问题讨论】:

    标签: android bottom-sheet


    【解决方案1】:

    添加这个:

    override fun setupDialog(dialog: Dialog?, style: Int) {
        super.setupDialog(dialog, style)
        dialog?.window?.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    }
    

    (from)

    还要加上这个:

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        var viewParent = view
        while (viewParent is View) {
            viewParent.fitsSystemWindows = false
            viewParent.setOnApplyWindowInsetsListener { _, insets -> insets }
            viewParent = viewParent.parent as View?
        }
    }
    

    这是做什么的? DialogFragment#onActivityCreated() 调用Dialog#setContentView(),它将对话框的视图包装在一个私有的“wrapInBottomSheet”中。为了设置这些包装视图的正确标志,我们希望在它们被包装之后设置标志,例如在 super.onActivityCreated() 之后

    同时关注this talk 以获取有关fitsSystemWindows 和窗口插图的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多