Android View之布局載入流程

2021-09-07 19:29:41 字數 2115 閱讀 5803

最近準備重新學習下android,加深理解,快速形成自己的知識結構體系。最先學習的就算view部分,從自定義view到activty層次結構,到layout載入過程。等等都會看一遍,在此記錄下layout的載入過程

2.1 activity的流程載入

activity類中setcontentview 追蹤(善於用bookmark)

public void setcontentview(@layoutres int layoutresid)  

追蹤**,phonewindow的setcontentview方法:

mlayoutinflater.inflate(layoutresid,mcontentparent)
由**片段可以看出來:layoutresid的父布局就是mcontentparent。那麼mcontentparent究竟是什麼呢?

我們知道decorview 包括titleview +contentview.

追蹤**:installdescor():

generatelayout()方法:

給decorview新增乙個名字為mcontentroot的view。並且mcontentroot裡面包含了乙個id為id_android_content的 mcontentparent.

得到了mcontentparent之後,在根據mlayoutinflater.inflate(layoutresid,mcontentparent) 就將layout布局載入進了decorview,然後這個檢視才能被我們看到。

驗證:

image.png

說明了mcontentparent是framlayout

@override

public void setcontentview(@layoutres int layoutresid)

getdelegate():

@nonnull

跟蹤create()方法,

activity.getwindow() 由上面可知,得到的肯定是phonewindow。問題來了,activity這個時候真的能得到乙個非null的phonewindow嗎?。發現在activity呼叫attach方法的時候就會初始化phonewindow:

activity.attach是在performlaunchactivity中本呼叫,也就是在activitythread中被呼叫。所以在activity中任何時候getwindow(),都能得到phonewindow。

繼續跟蹤**:

create方法呼叫的是:

@override

public void setcontentview(int resid)

viewgroup contentparent = (viewgroup) msubdecor.findviewbyid(android.r.id.content);
很容易讓我們想到msubdecor 是不是等同於上文中的mcontentroot 呢?

看看ensuresubdecor怎麼寫的:

if (moverlayactionmode)  else  

subdecor 是系統提供的viewgroup 裡面有乙個android.r.id.content布局,和mcontentroot 作用一模一樣。

基本上分析到此結束,也是比較簡單。

Android View之彈性滑動

一 使用scroller 繼承自rlativelayout,通過invalidate 和postinvalidate 兩個方法的靈活運用 public class mainactivity extends relativelayout mscroller.startscroll方法什麼也沒做,只是保...

網頁排版布局方法加伸縮布局

一 布局 二 frameset框架 三 浮動定位加css div來布局 四 伸縮布局 浮動後脫離標準流清除浮動 父元素加overflow hidden 伸縮容器 給那個元素加display flex 那個就是伸縮容器 伸縮項 他的子元素就是伸縮項 在伸縮布局中,預設情況下水平方向是主軸,預設情況下主...

頁面布局之flex布局

flex布局 flex布局也叫作彈性盒子布局,可以簡便 完整 響應式的實現各種頁面布局,同時也支援所有的瀏覽器。父級元素設定css樣式為 display flex。內容的位置用justify content來控制,常用的屬性有 space between space around center le...