显示Alert Dialog Android

时间:2015-11-11 04:34:46

标签: android alertdialog statusbar

我正在创建一个应用程序,当您按下某个按钮时会弹出警告对话框。状态栏需要隐藏,所以我的活动中有一个方法:

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

我在activity的onCreate方法中调用此方法,并且它会正常工作,直到弹出警告对话框。显示警告对话框后,状态栏将立即返回。我尝试了以下方法:

alertDialog.show();
hideStatusBar();

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

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

使状态栏的背景透明,但仍然不会隐藏它。有没有办法在显示警告对话框时隐藏状态栏?

4 个答案:

答案 0 :(得分:5)

每个对话框都有自己的Window,它有自己的风格。

在你的情况下,hideStatusBar()无法正常工作,因为它来自活动的onCreate(),这意味着它会尝试更改活动窗口的外观,但不会更改对话框和&#39} #39;窗口。

解决方案是:

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

答案 1 :(得分:3)

使用AlertDialog.Builder构建AlertDialog并创建AlertDialog。
在调用show()之前,请将对话框的窗口标志设置为不可聚焦。
显示对话框后,在代表AlertDialog的窗口的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元素。希望这会有所帮助。

答案 2 :(得分:0)

尽管这里有答案,但我对此有很多麻烦。这是我发现在Kotlin中隐藏状态栏的解决方案。

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

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

答案 3 :(得分:-1)

试试这个,

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