Android 中的setContentView(R.layout.activity_main)源碼解析

? ? 一個(gè)Activity在啟動(dòng)的時(shí)候,都會(huì)在onCreat()方法中執(zhí)行setContentView(R.layout.activity_main)這行代碼,來(lái)將指定的資源xml文件加載到對(duì)應(yīng)的activity中,那么它究竟是做了什么操作呢?下面就跟大家一起來(lái)看一下源碼。(本文所講是以繼承Activity,為例,并不是AppCompatActivity)

點(diǎn)擊setContentView(R.layout.activity_main)這行代碼,進(jìn)入到Activity類(lèi)里。

我們發(fā)現(xiàn)setContentView實(shí)際上是調(diào)用的Window的setContentView方法

繼續(xù)追蹤,getWindow()返回的mWindow為PhoneWindow對(duì)象

好,我們找到PhoneWindow里面的setContentView()方法,注意里面的installDecor()這個(gè)方法。在這個(gè)方法里new 了一個(gè)DecorView對(duì)象。

注意這行代碼,將傳入的layoutResID加載到mContentParent里面,那么mContentParen又是誰(shuí)呢?

我們追蹤到installDecor()這個(gè)方法里面,發(fā)現(xiàn)是generateLayout(mDecor)這個(gè)方法賦值。繼續(xù)追蹤這個(gè)方法。

注意這個(gè)方法的這里,他將R.layout.screen_simple這個(gè)資源xml加載到了DecorView里面

這就是R.layout.screen_simple這個(gè)資源xml,可以看到是一個(gè)垂直的線(xiàn)性布局,上面的ViewStub就是咱們的appBar,下面的FrameLayout的id為content!,咱們所加載的activity xml頁(yè)面就是加載到這個(gè)布局里面。

看一下mDecor.onResourcesLoaded(mLayoutInflater, layoutResource)這行代碼:

root這個(gè)View所代表的的就是 R.layout.screen_simple,然后DecorView調(diào)用addView將root加載到DecorView里面。最后下圖就是我們Android的activity界面的構(gòu)成,咱們所有的界面都在黃色區(qū)域中,F(xiàn)rameLayout的ID為content。


以上僅為個(gè)人整理的筆記,如有錯(cuò)誤或者疑問(wèn)請(qǐng)大家隨時(shí)指出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容