最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Android Dialog窗口機制

 更新時間:2022年04月12日 10:46:54   作者:醬油奶茶  
本文主要介紹了Android Dialog窗口機制,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

問題引出

//創(chuàng)建dialog 方式一
 AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
  // 創(chuàng)建dialog 方式二
 AlertDialog.Builderbuilder=new AlertDialog.Builder(getApplicationContex());

區(qū)別在構(gòu)造時候于一個傳當(dāng)前activity 一個Application。第二種方式報錯。那么區(qū)別在哪兒呢?

Dialog 與 Activity 共用一個 WindowManager 對象,所以Activity與Dialog共用同一個mAppToken值。所以在創(chuàng)建Dialog 時,如果傳的Context是Application

Dialog源碼分析

構(gòu)造方法

構(gòu)造方法中有三個比較重要的函數(shù),可以自己去源碼中查看

   // 步驟1. 獲取WindowManager對象
   mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);

   // 步驟2. 為Dialog創(chuàng)建新的Window
   Window w = PolicyManager.makeNewWindow(mContext);
   mWindow = w;

   // 步驟3. 關(guān)聯(lián)WindowManager與新Window
   // 注:第二個參數(shù)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 類型,創(chuàng)建過程類似于 Activity 的 Window 創(chuàng)建過程)
  • 步驟3:將新創(chuàng)建 Dialog 的 window 關(guān)聯(lián)到 Activity 的 WindowManager。特別注意的是:關(guān)于AppToken,只是Window的傳入的mAppToken對象是null,但不代表Dialog的window無token,

所以得出結(jié)論

  • 結(jié)論1:Dialog 與 Activity 共用一個 WindowManager 對象
  • 結(jié)論2:Dialog 擁有自己的窗口 Window(PhoneWindow 類型)
  • 結(jié)論3:Dialog 的 Window 由附屬的 Acitivty WindowManager 對象統(tǒng)一管理

show()方法

 // 1. 調(diào)用 Dialog的onCreate()
    dispatchOnCreate(null);

    // 2. 調(diào)用Dialog的onStart()
    onStart();

    // 3. 獲取當(dāng)前新Window的DecorView對象(類似于Activity)
    mDecor = mWindow.getDecorView();

    // 4. 獲取新Window的WindowManager.LayoutParams參數(shù)
    WindowManager.LayoutParams l = mWindow.getAttributes();

    // 5. 把一個View添加到與Activity共用的windowManager里
    mWindowManager.addView(mDecor, l);
  • Dialog獲取當(dāng)前新Window的DecorView對象時過程類似于Activity,所以有一種自定義Dialog布局的方式就是重寫Dialog的onCreate方法,使用setContentView傳入布局,類似于 Activity。
  • 步驟4:由于Dialog 與 Activity 共用一個 WindowManager 對象,所以Activity與Dialog共用同一個mAppToken值(只是Dialog和Activity的Window對象不同)。
  • 步驟5:添加過程與Activity 窗口添加過程 保持一致。

到此這篇關(guān)于淺談Android Dialog窗口機制的文章就介紹到這了,更多相關(guān)Android Dialog窗口機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

进贤县| 平舆县| 金寨县| 广昌县| 哈尔滨市| 右玉县| 正定县| 桐柏县| 志丹县| 黔江区| 黄陵县| 星座| 凌源市| 若羌县| 和林格尔县| 黄石市| 陇西县| 霍城县| 元江| 平安县| 南华县| 西吉县| 大新县| 赤壁市| 平湖市| 乌兰浩特市| 常德市| 鸡东县| 台中市| 绥棱县| 滦南县| 方城县| 昌吉市| 麦盖提县| 开江县| 徐州市| 阳西县| 武邑县| 伊川县| 南江县| 三都|