本文主要介绍了AndroidDialog窗口机制,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
问题引出
//创建dialog 方式一
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
// 创建dialog 方式二
AlertDialog.Builderbuilder=new AlertDialog.Builder(getApplicationContex());区别在构造时候于一个传当前activity 一个Application。第二种方式报错。那么区别在哪儿呢?
Dialog 与 Activity 共用一个 WindowManager 对象,所以Activity与Dialog共用同一个mAppToken值。所以在创建Dialog 时,如果传的Context是Application
Dialog源码分析
构造方法
构造方法中有三个比较重要的函数,可以自己去源码中查看
// 步骤1. 获取WindowManager对象
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
// 步骤2. 为Dialog创建新的Window
Window w = PolicyManager.makeNewWindow(mContext);
mWindow = w;
// 步骤3. 关联WindowManager与新Window
// 注:第二个参数token为null,即一个Window属于Dialog的话,那么该Window的传入的mAppToken对象是null,Dialog没有自己的token
w.setWindowManager(mWindowManager, null, null);- 步骤1:因为 context 是Activity,所以获取到的 WindowManager 属于 Activity,所以** Dialog 与 Activity 共用一个 WindowManager 对象**
- 步骤2:获得 Activity 的WindowManager对象后,Dialog 又新建了一个 Window对象(PhoneWindow 类型,创建过程类似于 Activity 的 Window 创建过程)
- 步骤3:将新创建 Dialog 的 window 关联到 Activity 的 WindowManager。特别注意的是:关于AppToken,只是Window的传入的mAppToken对象是null,但不代表Dialog的window无token,
所以得出结论
- 结论1:Dialog 与 Activity 共用一个 WindowManager 对象
- 结论2:Dialog 拥有自己的窗口 Window(PhoneWindow 类型)
- 结论3:Dialog 的 Window 由附属的 Acitivty WindowManager 对象统一管理
show()方法
// 1. 调用 Dialog的onCreate()
dispatchOnCreate(null);
// 2. 调用Dialog的onStart()
onStart();
// 3. 获取当前新Window的DecorView对象(类似于Activity)
mDecor = mWindow.getDecorView();
// 4. 获取新Window的WindowManager.LayoutParams参数
WindowManager.LayoutParams l = mWindow.getAttributes();
// 5. 把一个View添加到与Activity共用的windowManager里
mWindowManager.addView(mDecor, l);- Dialog获取当前新Window的DecorView对象时过程类似于Activity,所以有一种自定义Dialog布局的方式就是重写Dialog的onCreate方法,使用setContentView传入布局,类似于 Activity。
- 步骤4:由于Dialog 与 Activity 共用一个 WindowManager 对象,所以Activity与Dialog共用同一个mAppToken值(只是Dialog和Activity的Window对象不同)。
- 步骤5:添加过程与Activity 窗口添加过程 保持一致。
到此这篇关于浅谈Android Dialog窗口机制的文章就介绍到这了,更多相关Android Dialog窗口机制内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
织梦狗教程
本文标题为:浅谈Android Dialog窗口机制
基础教程推荐
猜你喜欢
- iOS开发教程之XLForm的基本使用方法 2023-05-01
- IOS应用内跳转系统设置相关界面的方法 2022-11-20
- android studio按钮监听的5种方法实例详解 2023-01-12
- IOS 播放系统提示音使用总结(AudioToolbox) 2023-03-01
- Android开发使用RecyclerView添加点击事件实例详解 2023-06-15
- Android多返回栈技术 2023-04-15
- 解决Android Studio突然不显示logcat日志的问题 2023-02-04
- Android中的webview监听每次URL变化实例 2023-01-23
- Flutter绘图组件之CustomPaint使用详解 2023-05-12
- Flutter手势密码的实现示例(附demo) 2023-04-11
