项目的奇葩需求,需要弹出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'

Android 关于Dialog在全屏弹出会显示状态栏和导航栏的问题解决的更多相关文章

  1. WPF Popup全屏 弹出方法。解决只显示75%的问题。

    WPF Popup全屏 弹出方法.解决只显示75%的问题.   WPF 中 Popup 有一个特点.当Popup的高度超过屏幕的75%的时候,只显示75%的高度. 如下代码: <Window x ...

  2. SpriteBuilder全屏弹出菜单的特殊效果

    但是等一下!这里可以有更多.对于全屏的弹出菜单,你可以在显示弹出全屏菜单时朦胧化背景的level视图. 通过修改SpriteBuilder中的color节点的Color属性(比如修改为black)和O ...

  3. android 自己定义状态栏和导航栏分析与实现

    效果 android 4.4之后,系统是支持自己定义状态栏和导航栏的.举个最典型的样例就是bilibiliclient了(iOS版本号和android版本号能用两套全然不一样符合各自系统的设计ui,良 ...

  4. Android UI体验之全屏沉浸式透明状态栏效果

    前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...

  5. Android开发 - 设置DialogFragment全屏显示

    默认的DialogFragment并不是全屏,但有些需求需要我们将对话框设置为全屏(内容全屏),Android并没有提供直接的API,通过其它不同的方法设置全屏在不同的机型上总有一些诡异的问题,经过测 ...

  6. Android实现横屏以及全屏的小技巧

    分享两个安卓的实用小技巧,那就是横屏和全屏的实现. 首先是横屏的实现 首先是在清单文件中实现 <activity android:name=".MainActivity" a ...

  7. js实现全屏弹框

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. 仿QQ空间根据位置弹出PopupWindow显示更多操作效果

    我们打开QQ空间的时候有个箭头按钮点击之后弹出PopupWindow会根据位置的变化显示在箭头的上方还是下方,比普通的PopupWindow弹在屏幕中间显示好看的多. 先看QQ空间效果图:       ...

  9. 控制弹出div显示在鼠标附近的位置

    前一个页面: $("#txt_ocname").click(function () { art.dialog.open("/SelPosAll.aspx", { ...

  10. Visual Studio 打开解决方案后 弹出框显示 "正在打开文件..." 迟迟没反应 的解决方法

    Visual Studio 打开解决方案后 弹出框显示 "正在打开文件...",任务管理器的devenv进程又很正常,不会显示"未响应". 而IDE的左下角有个 ...

随机推荐

  1. 多进程|基于非阻塞调用的轮询检测方案|进程等待|重新理解挂起|Linux OS

    说在前面 今天给大家带来操作系统中进程等待的概念,我们学习的操作系统是Linux操作系统. 我们今天主要的目标就是认识wait和waitpid这两个系统调用. 前言 那么这里博主先安利一下一些干货满满 ...

  2. SpringMVC的执行流程及初始化流程

    今天大致来看一下Spring MVC的执行流程和初始化流程是什么样的 1,执行流程:也就是一个请求是怎么到我们Controller的 2,初始化流程:也就是那些 HandlerMapping.Hand ...

  3. CF131D Subway 题解

    题目传送门 前置知识 强连通分量 | 最短路 解法 考虑用 Tarjan 进行缩点,然后跑最短路. 缩点:本题的缩点有些特殊,基于有向图缩点修改而得,因为是无向图,所以在 Tarjan 过程中要额外记 ...

  4. 【Unity3D】边缘检测特效

    1 边缘检测原理 ​ 边缘检测的原理是:检测每个像素周围的像素亮度差,如果亮度差异较大,就将该像素识别为边缘,并进行边缘着色. ​ 本文完整资源见→Unity3D边缘检测特效. ​ 使用过卷积神经网络 ...

  5. flask+xlswriter+axios导出Excel

    flask后端 starttime = request.json.get('starttime') endtime = request.json.get('endtime') # 根据时间查询数据库数 ...

  6. Springboot+Vue+ElementUI实现的宿舍管理系统

    项目说明 doman是一个基于Springboot+Vue实现的前后端分离的宿舍管理系统.项目为本人亲手打造,需要的朋友可以拿去做个修改也是不错的.大神请忽略:) 项目功能 详细请看功能演示: Spr ...

  7. C++ 线程的学习---线程死锁

      因为是学习篇,写下是为了个人的学习与理解.故参考其他文章为多. 为什么会有死锁?           想象一下这样的情况,thread A 在run的时候需要等待thread B的结果,也就是th ...

  8. 正则计算器---day19

    计算下面表达式最后的结果 strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))& ...

  9. django中一些快捷函数

    1.get_object_or_404() 接收两个参数,参数1为模型类,参数2为查询参数 查询到对象则返回对象,查询不到则返回http404,但是不会返回模型的DoesNotExist异常 示例: ...

  10. ProtoBuf 基本使用

    一.是什么 Protocol Buffers,是Google公司开发的一种数据描述语言,是一种平台无关.语言无关.可扩展且类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. 二.为什 ...