隐藏状态栏同时显示警报对话框Android

17

我正在制作一个应用程序,在按下某个按钮时会弹出警示对话框。状态栏需要被隐藏,因此我在我的 Activity 中有一个方法:

private void hideStatusBar(){
    if (Build.VERSION.SDK_INT < 16){
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    else {
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
    }
}

在活动的onCreate方法中调用此方法,在警示对话框弹出之前,它可以正常工作。一旦警示对话框显示,状态栏就会重新出现。我尝试了以下方法:

alertDialog.show();
hideStatusBar();

这不起作用。然后我覆盖了我的活动的onWindowFocusChanged方法:

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    hideStatusBar();
}

如何使状态栏透明,同时又不隐藏状态栏。有没有办法在显示警告对话框时保持状态栏隐藏?


在显示对话框之前,您是否调用了hidestatusbar()方法? - Arslan Ashraf
是的,我尝试在调用alertDialog.show()之前调用hidestatusbar(),但这也没有任何作用。 - Thomas
你尝试使用自定义样式对话框吗?或者设置高度和宽度参数了吗? - Arslan Ashraf
尝试使用DialogFragment。我没有用过它,但我认为它会起作用。 - Arslan Ashraf
如果您可以使用DialogFragment,那么这个解决方案对我很有效:https://stackoverflow.com/a/39182367 - ban-geoengineering
4个回答

10
使用AlertDialog.Builder构建AlertDialog并创建AlertDialog。
在调用show()之前,将对话框的Window标志设置为不可聚焦。
在显示对话框后,在代表AlertDialog的Window的decorView上设置SystemUiVisibility标志,并清除不可聚焦标志。
    AlertDialog.Builder adBuilder = new AlertDialog.Builder(this);
    AlertDialog alertDialog = adBuilder.setCancelable(false).
            setMessage("Turn ended, Click OK").
            setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                }
            }).create();
    alertDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    alertDialog.show();
    alertDialog.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
    alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);

现在当AlertDialog显示时,SystemUI元素不会出现。希望这能有所帮助。

你传递给SetSystemUiVisitiliby()的标志数量过多,例如View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION只有在未使用View.SYSTEM_UI_FLAG_HIDE_NAVIGATION时才会生效。最好参考官方文档https://developer.android.com/reference/android/view/View.html,为每个人的用例选择要使用的标志。除此之外,回答得非常好! - setholopolus
在显示我的“AlertDialog”后,“getWindow()”始终返回“null”,因此我无法设置任何标志。有人知道为什么会发生这种情况吗? - Sakiboy
1
最终我使用了这个回答来处理DialogFragments:https://dev59.com/MGEh5IYBdhLWcg3wHARD#24549869 - Sakiboy
6
使用alertDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); alertDialog.show();就足以让我显示弹窗而没有系统 UI 跳出来。 - Monster Brain

10
每个对话框都有自己的窗口,这些窗口有各自的样式。
在你的情况下,hideStatusBar()不起作用,因为它是从活动的onCreate()中调用的,这意味着它试图改变活动窗口的外观,而不是对话框窗口的外观。
解决方案是:
子类化AlertDialog。 将hideStatusBar()移动到那里,并从对话框的onCreate()中调用它。
这意味着你必须处理Dialog.getWindow()而不是Activity.getWindow()
以下是一个小例子:
public static class TranslucentDialog extends AlertDialog {
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
}

2

尽管这里有答案,我仍然遇到了很多问题。以下是我在Kotlin中找到的隐藏状态栏的解决方案。

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

请注意,如果您保留对话框并希望在关闭后再次显示相同的对话框,则必须重新设置标志。

如果使用此功能,键盘将不会显示。 - Arty Morris
尝试使用以下代码:dialog.window?.let { WindowInsetsControllerCompat(it, it.decorView).apply { hide(WindowInsetsCompat.Type.systemBars()) } }但它的行为不正常,下面的解决方案可以解决问题。 - kallis

-2

试试这个,

final Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.activity_no_title_dialog);
dialog.show();

标题:作者说状态栏 https://developer.android.com/training/system-ui/status.html - user25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接