Java 如何始终隐藏底部控制栏,即使在对话框显示并关闭之后?

Java 如何始终隐藏底部控制栏,即使在对话框显示并关闭之后?,java,android,android-layout,kotlin,android-alertdialog,Java,Android,Android Layout,Kotlin,Android Alertdialog,我实现的是这样的 我在活动中设置了它 window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) 状态栏不应隐藏,而应仅隐藏控制栏 然后,当我打开一个对话框并关闭它时,我调用下面的方法: private fun setDefaultUi(dialog: Dialog?) { var decorView: View? = nu

我实现的是这样的

我在活动中设置了它

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更改并再次应用标志时,我仅在所有API和设备上使用
SystemUiVisibilityChangeListener
实现了这一点。以下是Kotlin中的示例代码:

fun hideStatusBar() {
        DisplayUtil.hideStatusBar(activity)
        activity?.window?.decorView?.setOnSystemUiVisibilityChangeListener { visibility ->
            if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) {
                DisplayUtil.hideStatusBar(activity)
            }
        }
    }
和显示util.hideStatusBar(活动):


另外,不要忘记在不需要侦听器时删除它。

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


我想显示状态栏(透明)并隐藏控制栏。此代码隐藏状态栏和控制栏。将UI标志更改为仅隐藏控制栏,您将获得所需的内容。我在哪里可以获得
DisplayUtil
?请阅读整个答案,或者只使用隐藏控制栏的代码而不是DisplayUtil。hideStatusBar(活动)我更新了答案,以便更清楚地了解对话的DisplayUtiluse侦听器(OnCancelListener)是什么。在取消时,隐藏导航栏。
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)
            }
        }
}

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