一澄阳、View是如何被添加到屏幕窗口上的轩拨?
1)找到入口:setContentView(int layoutResID)
? ? 點進去,進入 Activity的 setContentView()昧甘。
? ? 2)getWindow()是什么命黔?
? ? ? ?從這里可以看出呜呐,getWindow()就是單純返回一個 Window對象。
根據(jù)注釋悍募,得知 Window是作為最高級別的視圖添加到 WindowManager蘑辑,并且 PhoneWindow是它的唯一實現(xiàn)類。也就是說坠宴,getWindow.setContentView()直接去看 PhoneWindow的setContentView()干了些什么就可以了洋魂。
? ? 3)PhoneWindow的?setContentView() 做了些什么?
? ?接著看 installDecor()里面的代碼喜鼓,里面太長副砍,有150行,只好刪掉一些不太重要的代碼庄岖。
? ? 4)PhoneWindow的 installDecor()干了些什么豁翎?
刪掉了大部分的什么 background、UI隅忿、Logo心剥、Title、Icon這類的設(shè)置背桐,把核心的提取优烧。
?mDecor = generateDecor(-1)里面干了些什么?
結(jié)論:生成一個 DecorView對象链峭,此對象本質(zhì)是一個 FrameLayout畦娄!
下面看 5)論證。
mContentParent = generateLayout(mDecor)里面干了什么?
結(jié)論:得到一個 FrameLayout纷责。
下面看 6)論證捍掺。
? ? 5)generateDecor(-1)里面干了些什么撼短?
刪掉大部分代碼再膳,可以看出,返回了一個 DecorView對象曲横,那么這個 DecorView是什么東東喂柒?
官方?jīng)]有注釋,但是可以知道禾嫉,實際上灾杰, DecorView就是一個 FrameLayout。
6)generateLayout(mDecor)里面干了什么熙参?
? ? 1艳吠,通過各種判斷,設(shè)置一大堆樣式孽椰,主題特性等昭娩。setFlags()、requestFeauter()黍匾。
? ? 2栏渺,通過不同的 feature值,選定 layoutResource的值锐涯,并執(zhí)行 mDecor.onResourcesLoaded()
? ? 3磕诊,獲取系統(tǒng)主布局。final int ID_ANDROID_CONTENT = com.android.internal.R.id.content;
點進去就是這么個 ID纹腌。
? ? 結(jié)論:返回一個 contentParent霎终,這本質(zhì)是一個 FrameLayout。(證明看 7)
7)mDecor.onResourcesLoaded()干了些什么升薯?
? ? 通過 layoutReouce創(chuàng)建一個 View對象莱褒,此對象可以就是上面根據(jù)不同 feature選取的值,例如:R.layout.screen_simple(系統(tǒng) XML)覆劈,在通過 addView()把 View對象加載到 DecorView上保礼。
通過查看,這個根據(jù)不同條件選擇的必定含有的 ID:content责语,本質(zhì)是一個 FrameLayout炮障。
繼續(xù)回到 Activity的 setContentView()
8)mLayoutInflater.inflate(layoutResID, mContentParent)
最后,將在activity上設(shè)置的布局 layoutResID 加載到 contentParent上 也就是 FrameLayout上坤候。至此胁赢,我們的整個View就加載并顯示到屏幕上了。
總結(jié):
? ? 1).創(chuàng)建頂層的布局容器DecorView白筹。
? ? 2)在頂層布局中加載基礎(chǔ)布局的ViewGroup
? ? 3)將ContentView添加到基礎(chǔ)布局中的FrameLayout中智末。
view是如何被添加到屏幕窗口上的谅摄?
? ??首先系統(tǒng)會創(chuàng)建一個頂層布局容器DecorView。DecorView 是一個ViewGroup容器系馆, 繼承FrameLayout送漠,是PhoneWindow對象持有的一個實例,他是所有應(yīng)用程序的頂層View由蘑,在系統(tǒng)內(nèi)部進行初始化闽寡。當(dāng)DecorView 初始化完成后,系統(tǒng)會根據(jù)應(yīng)用程序的頂層特性會加載一個基礎(chǔ)容器尼酿,例如no_actionBar等爷狈,不同的主題加載的基礎(chǔ)容器也不一樣,但是無論什么樣的的基礎(chǔ)容器一定會有一個?android.R.di.content?的FrameLayout裳擎。開發(fā)者通過setContView設(shè)置的xml 涎永,通過解析后就加載到了這個FrameLayout中