经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android加载loading对话框的功能及实例代码(不退出沉浸式效果)
来源:jb51  时间:2018/12/10 9:19:42  对本文有异议

一、自定义Dialog

在沉浸式效果下,当界面弹出对话框时,对话框将获取到焦点,这将导致界面退出沉浸式效果,那么是不是能通过屏蔽对话框获取焦点来达到不退出沉浸式的目的呢。说干就干,我们先来看一下改善后的效果图。

普通对话框弹出效果

LoadingDialog弹出效果

自定义LoadingDialog

  1. public class LoadingDialog extends Dialog {
  2. public LoadingDialog(Context context) {
  3. super(context);
  4. }
  5. public LoadingDialog(Context context, int theme) {
  6. super(context, theme);
  7. }
  8. @Override
  9. public void show() {
  10. //在show之前添加禁止获取焦点
  11. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
  12. super.show();
  13. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  14. int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
  15. | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  16. | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
  17. | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
  18. | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  19. | View.SYSTEM_UI_FLAG_FULLSCREEN;
  20. this.getWindow().getDecorView().setSystemUiVisibility(uiOptions);
  21. }
  22. //在show之后取消禁止获取焦点属性,否则会导致dialog无法处理点击
  23. this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
  24. }
  25. }

通过上面不难看出,在show之前,我们添加了一个window的FLAG_NOT_FOCUSABLE属性,让window不能获取焦点,在show之后,移除刚刚添加的FLAG_NOT_FOCUSABLE属性,这样就实现了所需要的效果。

二、通过WindowManager的addView方法实现

  1. private WindowManager mwWindowManager;
  2. private FrameLayout mForewarnLayout;
  3. private boolean isShowing = false;
  4. /**显示全屏的加载动画*/
  5. public void alertLoadingDialog(){
  6. if (!isShowing){
  7. mForewarnLayout = (FrameLayout) LayoutInflater.from(getApplicationContext())
  8. .inflate(R.layout.view_loading, null, false);
  9. // 获取window管理对象
  10. mwWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
  11. // 设置布局参数
  12. WindowManager.LayoutParams forewarnLayoutParams = new WindowManager.LayoutParams();
  13. forewarnLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; // 设置window TYPE
  14. forewarnLayoutParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果位背景透明
  15. // 设置Window flag
  16. forewarnLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
  17. | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
  18. forewarnLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; //
  19. // 调整悬浮窗口至左上角,便于调整坐标
  20. // 设置悬浮窗口长宽数据
  21. forewarnLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
  22. forewarnLayoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
  23. // forewarnLayoutParams.windowAnimations = R.style.anim_view;// 添加进入动画
  24. // 添加布局视图
  25. mwWindowManager.addView(mForewarnLayout, forewarnLayoutParams);
  26. isShowing = true;
  27. }
  28. }
  29. /**取消全屏的加载动画*/
  30. public void dismissTwo() {
  31. if (isShowing) {
  32. mwWindowManager.removeViewImmediate(mForewarnLayout);
  33. isShowing = false;
  34. }
  35. }

addView弹出效果

原理没啥可说的,直接用就完了,需要注意的是,addView和removeView需要一一对应,以上代码已经加了判断处理。还需要添加权限,不然会报错。

  1. uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

这里顺带说一下removeViewremoveViewImmediate的区别,两个方法设计到线程同步问题,removeViewImmediate()是通知View立刻调用View.onDetachWindow(),这说明这个方法是通过一个监听或者观察者来实现的,因为线程的同步跟异步问题导致activity销毁了,但view还没有被remove完,会导致窗体泄露。

总结

以上所述是小编给大家介绍的Android加载loading对话框的功能及实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对w3xue网站的支持!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号