Android LayoutInflater原理分析,View系列(一)

這篇文章是學(xué)習(xí)郭大神的系列文章的筆記,原文在下面
Android LayoutInflater原理分析收津,帶你一步步深入了解View(一)

  • 首先需要獲取到LayoutInflater的實(shí)例伙窃,

    LayoutInflater layoutInflater = LayoutInflater.from(context);

    LayoutInflater layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

  • layoutInflater.inflate(resourceId, root);

    inflate()方法一般接收兩個(gè)參數(shù)菩颖,第一個(gè)參數(shù)就是要加載的布局id,第二個(gè)參數(shù)是指給該布局的外部再嵌套一層父布局为障,如果不需要就直接傳null晦闰。這樣就成功成功創(chuàng)建了一個(gè)布局的實(shí)例,之后再將它添加到指定的位置就可以顯示出來了鳍怨。

public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) {
synchronized (mConstructorArgs) {
final AttributeSet attrs = Xml.asAttributeSet(parser);
mConstructorArgs[0] = mContext;
View result = root;
try {
int type;
while ((type = parser.next()) != XmlPullParser.START_TAG &&
type != XmlPullParser.END_DOCUMENT) {
}
if (type != XmlPullParser.START_TAG) {
throw new InflateException(parser.getPositionDescription()
+ ": No start tag found!");
}
final String name = parser.getName();
if (TAG_MERGE.equals(name)) {
if (root == null || !attachToRoot) {
throw new InflateException("merge can be used only with a valid "
+ "ViewGroup root and attachToRoot=true");
}
rInflate(parser, root, attrs);
} else {
View temp = createViewFromTag(name, attrs);
ViewGroup.LayoutParams params = null;
if (root != null) {
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
temp.setLayoutParams(params);
}
}
rInflate(parser, temp, attrs);
if (root != null && attachToRoot) {
root.addView(temp, params);
}
if (root == null || !attachToRoot) {
result = temp;
}
}
} catch (XmlPullParserException e) {
InflateException ex = new InflateException(e.getMessage());
ex.initCause(e);
throw ex;
} catch (IOException e) {
InflateException ex = new InflateException(
parser.getPositionDescription()
+ ": " + e.getMessage());
ex.initCause(e);
throw ex;
}
return result;
}
}

LayoutInflater其實(shí)就是使用Android提供的pull解析方式來解析布局文件的呻右。

*  它們其實(shí)是用于設(shè)置View在布局中的大小的,也就是說鞋喇,首先View必須存在于一個(gè)布                                
 局中声滥,之后如果將layout_width設(shè)置成match_parent表示讓View的寬度填充滿布局,如果設(shè)置成wrap_content表示讓View的寬度剛好可以包含其內(nèi)容侦香,如果設(shè)置成具體的數(shù)值則View的寬度會變成相應(yīng)的數(shù)值落塑。這也是為什么這兩個(gè)屬性叫作layout_width和layout_height纽疟,而不是width和height
 但是在我們平時(shí)setContentView的時(shí)候,我們并沒有在外指定一個(gè)父布局憾赁,但是仍然起效污朽,是因?yàn)橄到y(tǒng)在setContentView之前自動幫我們指定了一個(gè)FrameLayout.
 ![contentView](http://upload-images.jianshu.io/upload_images/1859111-a5c5c912e6e5495d?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


![View樹結(jié)構(gòu)](http://upload-images.jianshu.io/upload_images/1859111-e5c2d8b979b0f04b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
每個(gè)Activity都包含一個(gè)Window對象,在android中Window對象通常有phoneWindow來實(shí)現(xiàn)龙考,PhoneWindow將一個(gè)DecorView設(shè)置為整個(gè)應(yīng)用的窗口的根View蟆肆。
ContentView就是一個(gè)ID為content的FrameLayout,activity_main.xml就是設(shè)置在這樣的一個(gè)FrameLayout中。
![UI界面架構(gòu)圖](http://upload-images.jianshu.io/upload_images/1859111-b4ce7638d58b1536.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洲愤,一起剝皮案震驚了整個(gè)濱河市颓芭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柬赐,老刑警劉巖亡问,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肛宋,居然都是意外死亡州藕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門酝陈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來床玻,“玉大人,你說我怎么就攤上這事沉帮⌒馑溃” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵穆壕,是天一觀的道長待牵。 經(jīng)常有香客問我,道長喇勋,這世上最難降的妖魔是什么缨该? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮川背,結(jié)果婚禮上贰拿,老公的妹妹穿的比我還像新娘。我一直安慰自己熄云,他們只是感情好膨更,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缴允,像睡著了一般询一。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天健蕊,我揣著相機(jī)與錄音,去河邊找鬼踢俄。 笑死缩功,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的都办。 我是一名探鬼主播嫡锌,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琳钉!你這毒婦竟也來了势木?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤歌懒,失蹤者是張志新(化名)和其女友劉穎啦桌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體及皂,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甫男,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了验烧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片板驳。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碍拆,靈堂內(nèi)的尸體忽然破棺而出若治,到底是詐尸還是另有隱情,我是刑警寧澤感混,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布端幼,位于F島的核電站,受9級特大地震影響浩习,放射性物質(zhì)發(fā)生泄漏静暂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一谱秽、第九天 我趴在偏房一處隱蔽的房頂上張望洽蛀。 院中可真熱鬧,春花似錦疟赊、人聲如沸郊供。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驮审。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疯淫,已是汗流浹背地来。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熙掺,地道東北人未斑。 一個(gè)月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像币绩,于是被迫代替她去往敵國和親蜡秽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容