項目的奇葩需求,需要彈出Dialog不要顯示狀態欄和導航欄,記錄一下解決方法 原文地址:Android 關於Dialog在全屏彈出會顯示狀態欄和導航欄的問題解決 Stars-one的雜貨小窩 說明 Android的原生的Dialog有個問題,如果你的Activity設置為全屏的,然後顯示Dialog ...
項目的奇葩需求,需要彈出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'
提問之前,請先看提問須知 點擊右側圖標發起提問 或者加入QQ群一起學習 TornadoFx學習交流群:1071184701