项目的奇葩需求,需要弹出Dialog不要显示状态栏和导航栏,记录一下解决方法
原文地址:Android 关于Dialog在全屏弹出会显示状态栏和导航栏的问题解决 Stars-one的杂货小窝
说明
Android的原生的Dialog有个问题,如果你的Activity设置为全屏的,然后显示Dialog会出现状态栏和导航栏,这是由于Dialog的焦点引起的问题
本文就是直接列举出了解决方法,原理这里就不细说了
解决方法
1.定义一个MyDialog
这里使用继承方法,定义了一个MyDialog
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
/**
* 此对话框适合在activity全屏适合弹出
*/
public class MyDialog extends AlertDialog {
protected MyDialog(Context context) {
super(context);
}
/**
* 使用方法(可以自行再封装一下)
* @param context
* @param message
* @return
*/
public static MyDialog create(Context context, String message) {
MyDialog mydialog = new MyDialog(context);
mydialog.setTitle("提示");
mydialog.setMessage(message);
mydialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
mydialog.create();
return mydialog;
}
@Override
public void show() {
Window window = getWindow();
focusNotAle(window);
super.show();
hideNavigationBar(window);
clearFocusNotAle(window);
}
/**
* 隐藏虚拟栏 ,显示的时候再隐藏掉
*
* @param window
*/
public void hideNavigationBar(Window window) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
window.getDecorView().setOnSystemUiVisibilityChangeListener(visibility -> {
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
//布局位于状态栏下方
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
//全屏
View.SYSTEM_UI_FLAG_FULLSCREEN |
//隐藏导航栏
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
if (Build.VERSION.SDK_INT >= 19) {
uiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
} else {
uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
window.getDecorView().setSystemUiVisibility(uiOptions);
});
}
/**
* dialog 需要全屏的时候用,和clearFocusNotAle() 成对出现
* 在show 前调用 focusNotAle show后调用clearFocusNotAle
*
* @param window
*/
public void focusNotAle(Window window) {
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
/**
* dialog 需要全屏的时候用,focusNotAle() 成对出现
* 在show 前调用 focusNotAle show后调用clearFocusNotAle
*
* @param window
*/
public void clearFocusNotAle(Window window) {
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
}
2.使用MyDialog
使用上述定义的Dialog
MyDialog myDialog = MyDialog.create(CallNumberWebviewActivity.this, message);
myDialog.show();
3.Activity设置监听
上述使用之后,如果是点击了对话框,还是会弹出状态栏和导航栏,需要在Activity中设置一下监听器,如下代码:
View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener(visibility -> BarUtils.setNavBarVisibility(CallNumberWebviewActivity.this, false));
PS:需要导入依赖
// Android的工具类 https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md
implementation 'com.blankj:utilcode:1.30.6'
标签:状态栏,MyDialog,window,FLAG,UI,全屏,Dialog,Android,View
From: https://www.cnblogs.com/stars-one/p/17136418.html