即使在对话框出现并关闭后,如何将底部控制条始终掩盖



我实施的就是这样。

我将其设置在活动中。

window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)

状态栏不应隐藏,而应只是控制栏。

然后,当我打开对话框并解散它时,我在下面称此方法为:

    private fun setDefaultUi(dialog: Dialog?) {
        var decorView: View? = null
        if (dialog == null) {
            decorView = this.window.decorView
        } else {
            decorView = dialog!!.window.decorView
        }
        decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
                        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                        or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY // hide status bar and nav bar after a short delay, or if the user interacts with the middle of the screen
                )
    }

类似的东西:

    private fun showMyDialog() {
        noticeUrlDialog = Dialog(this)
        noticeUrlDialog!!.setContentView(R.layout.dialog_my)
        val btnClose = myDialog!!.btn_close
        btnX.setOnClickListener {
            myDialog!!.dismiss()
            setDefaultUi(null)
        }
        myDialog!!.show()
        setDefaultUi(myDialog)
    }

这样,我可以隐藏对话框弹出并关闭后出现的底部控制栏。

,但我认为这不是一个正确的方法。我需要多次调用该方法,而且控制栏在setDefaultUi()之前显示了一秒钟。所以,我想知道是否有更好的方法?

我仅在收听UI时使用SystemUiVisibilityChangeListener在所有API和设备上实现了它,然后再次应用标志。这是Kotlin中的示例代码:

fun hideStatusBar() {
        DisplayUtil.hideStatusBar(activity)
        activity?.window?.decorView?.setOnSystemUiVisibilityChangeListener { visibility ->
            if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
                DisplayUtil.hideStatusBar(activity)
            }
        }
    }

DisplayUtil.hideStatusBar(activity)

object DisplayUtil {
 fun hideStatusBar(activity: Activity?) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                activity?.window?.decorView?.systemUiVisibility = (
                        View.SYSTEM_UI_FLAG_IMMERSIVE
                                or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                                or 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)
            } else {
                activity?.window?.decorView?.systemUiVisibility = (
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                or View.SYSTEM_UI_FLAG_FULLSCREEN)
            }
        }
}

也不要忘记在不需要时删除听众。

要保持沉浸式模式,您需要在显示之前将FLAG_NOT_FOCUSABLE设置为对话框的布局参数。但是,这也将阻止用户与对话框进行交互,因此调用show()后需要清除此标志。

private fun showMyDialog() {
        noticeUrlDialog = Dialog(this)
        noticeUrlDialog!!.setContentView(R.layout.dialog_my)
        val btnClose = myDialog!!.btn_close
        btnX.setOnClickListener {
            myDialog!!.dismiss()
            setDefaultUi(null)
        }
        myDialog.window?.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
        myDialog!!.show()
        myDialog!!.window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
        setDefaultUi(myDialog)
    }

最新更新