首页 > 解决方案 > 沉浸式全屏和首选项对话框下拉状态栏

问题描述

我正在使用沉浸式全屏活动,对于我的对话框,我使用了我在这里找到的 hack,我在打开对话框时将对话框设置为不可聚焦,因此它不会拉下状态栏。

dialog.window?.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)

现在我正在寻找一种为首选项对话框获得相同结果的方法(现在它只有一个 ListPreference)

我尝试在我的 PreferenceFragment 中覆盖 onDisplayPreferenceDialog 并在对话框上设置标志,但状态栏仍然显示。

标签: androidkotlinandroid-preferencesandroid-dialogfragmentandroid-dialog

解决方案


您可以覆盖onDisplayPreferenceDialog(preference: Preference?)并创建自己的AlertDialog

支持单选按钮,AlertDialog因此实际上您可以创建从首选项库本身呈现的相同对话框。当您显示该对话框时,您可以应用解决方法修复以在沉浸式模式下显示它。

override fun onDisplayPreferenceDialog(preference: Preference?) {
     AlertDialog.Builder(context)
                .setTitle(<titleResID>)
                .setSingleChoiceItems(<itemsArrayResID>, 0) { dialog, which ->
                    (preference as ListPreference).value = this.resources.getStringArray(<valuesArrayResID>)[which]
                    dialog.dismiss()
                }
                .setPositiveButton(R.string.cancel) { _, _ -> }
                .showImmersive()
}

实际上在这里我已经创建了showImmersive()扩展方法来AlertDialog.Builder使用解决方法黑客以沉浸模式显示警报对话框

fun AlertDialog.Builder.showImmersive(): AlertDialog {
    val alertDialog = create()

    alertDialog.window?.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)

    alertDialog.window?.decorView?.systemUiVisibility = (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)

    alertDialog.show()
    alertDialog.window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)

    return alertDialog
}

推荐阅读