自定义Android LoadingDialog:保持沉浸式效果的实现
151 浏览量
更新于2024-09-02
收藏 114KB PDF 举报
"这篇文章主要探讨了如何在Android中创建一个加载loading对话框,同时保持界面的沉浸式效果不受影响。作者提供了自定义Dialog的实例代码,以实现对话框弹出时不退出沉浸式状态。"
在Android开发中,当应用程序执行耗时操作时,通常会显示一个loading对话框来提示用户程序正在后台运行。然而,标准的对话框在显示时会获取焦点,这可能会导致界面失去沉浸式(即隐藏状态栏和导航栏)的效果。为了保持沉浸式体验,开发者需要自定义加载对话框。
文章首先介绍了问题的背景:在沉浸式状态下,当普通对话框弹出时,它会强制界面退出沉浸式模式,显示状态栏和导航栏。为了解决这个问题,作者提出了一种自定义`LoadingDialog`的方法。
`LoadingDialog`的实现包括以下几个关键步骤:
1. 继承Dialog类:创建一个新的`LoadingDialog`类,继承自`Dialog`,这样可以利用Dialog的基础功能并进行扩展。
2. 禁止获取焦点:在`show()`方法之前,设置窗口标志`FLAG_NOT_FOCUSABLE`,以防止对话框获取焦点并影响沉浸式状态。代码如下:
```java
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
```
3. 设置沉浸式UI选项:如果设备支持API 19及以上版本(KitKat),应用系统UI的隐藏和稳定布局标志,以保持沉浸式效果。这些标志包括`SYSTEM_UI_FLAG_LAYOUT_STABLE`, `SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION`, `SYSTEM_UI_FLAG_HIDE_NAVIGATION`, `SYSTEM_UI_FLAG_IMMERSIVE_STICKY`, `SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN` 和 `SYSTEM_UI_FLAG_FULLSCREEN`。代码如下:
```java
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_FULLSCREEN;
this.getWindow().getDecorView().setSystemUiVisibility(uiOptions);
```
4. 取消禁止获取焦点:在`show()`方法之后,取消设置的禁止获取焦点的标志,以便对话框在显示完毕后可以正常与用户交互。代码如下:
```java
// 在show之后取消禁止获取焦点属性
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
```
通过上述步骤,`LoadingDialog`可以在弹出时保持界面的沉浸式效果,用户可以看到加载指示器,而不会被导航栏或状态栏的出现打断。这种方法对于提供更好的用户体验非常有帮助,特别是在设计现代、简洁的应用界面时。开发者可以根据需要自定义对话框的样式和内容,如加载动画、文字提示等,以适应不同的应用场景。
点击了解资源详情
2016-05-25 上传
2020-10-16 上传
2021-01-20 上传
2021-01-05 上传
2021-03-16 上传
weixin_38688956
- 粉丝: 4
- 资源: 967
最新资源
- 火炬连体网络在MNIST的2D嵌入实现示例
- Angular插件增强Application Insights JavaScript SDK功能
- 实时三维重建:InfiniTAM的ros驱动应用
- Spring与Mybatis整合的配置与实践
- Vozy前端技术测试深入体验与模板参考
- React应用实现语音转文字功能介绍
- PHPMailer-6.6.4: PHP邮件收发类库的详细介绍
- Felineboard:为猫主人设计的交互式仪表板
- PGRFileManager:功能强大的开源Ajax文件管理器
- Pytest-Html定制测试报告与源代码封装教程
- Angular开发与部署指南:从创建到测试
- BASIC-BINARY-IPC系统:进程间通信的非阻塞接口
- LTK3D: Common Lisp中的基础3D图形实现
- Timer-Counter-Lister:官方源代码及更新发布
- Galaxia REST API:面向地球问题的解决方案
- Node.js模块:随机动物实例教程与源码解析