Отображение BottomSheetDialogFragment в режиме погружения - PullRequest
1 голос
/ 07 июня 2019

Я хочу показать 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)
            }
        }
    }
}

1 Ответ

0 голосов
/ 12 июля 2019

Добавьте это:

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

( из )

Также добавьте это:

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 ()

Также смотреть этот разговор для получения информации о fitsSystemWindows и оконных вставках.

...