網站首頁 編程語言 正文
問題引出
//創建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 窗口添加過程 保持一致。
原文鏈接:https://juejin.cn/post/7077830705677336590
相關推薦
- 2022-04-23 Tooltip 組件:根據內容是否溢出判斷是否顯示 Tooltip
- 2022-04-18 [webpack-cli] { Error: Cannot find module ‘acorn‘
- 2023-06-16 Qt6實現調用攝像頭并顯示畫面_C 語言
- 2023-05-06 Python格式化輸出的幾種匯總_python
- 2022-08-06 C語言繪制簡單時鐘小程序_C 語言
- 2022-09-17 C語言深入探索數據類型的存儲_C 語言
- 2022-02-13 imgwarp.cpp:3143: error: (-215:Assertion failed) _
- 2022-03-17 結合示例說明shell是如何被解析的_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支