setContentView原始碼解讀

2021-10-05 05:34:10 字數 3686 閱讀 8266

@override

public

void

setcontentview

(@layoutres

int layoutresid)

(

)return mdelegate;

}

public

@override

public

void

setcontentview

(int resid)

ensuresubdecor()方法原始碼如下:

private

void

ensuresubdecor()

}private viewgroup createsubdecor()

上述方法中最關鍵地方最終將會呼叫layoutinflater中的inflate(三個引數)方法,該方法原始碼如下所示:

public view inflate

(@layoutres

int resource,

@nullable viewgroup root,

boolean attachtoroot)

//檢視是否存在預編譯布局,一般情況該方法返回的都是空

view view =

tryinflateprecompiled

(resource, res, root, attachtoroot);if

(view != null)

//獲取xml解析器

xmlresourceparser parser = res.

getlayout

(resource)

;try

finally

}

上述開始解析布局檔案的inflate方法原始碼如下所示:

public view inflate

(xmlpullparser parser,

@nullable viewgroup root,

boolean attachtoroot)

rinflate

(parser, root, inflatercontext, attrs,

false);

}else

}// 解析相應view下面是否還有子控制項

rinflatechildren

(parser, temp, attrs,

true);

if(root != null && attachtoroot)

if(root == null ||

!attachtoroot)

}//....

return result;

}}

上述createviewfromtag方法原始碼如下所示:

private view createviewfromtag

(view parent, string name, context context, attributeset attrs)

view createviewfromtag

(view parent, string name, context context, attributeset attrs,

boolean ignorethemeattr)if(

!ignorethemeattr)

ta.recycle()

;}tryelse

}finally

}return view;

}catch

(inflateexception e)

}public

final view trycreateview

(@nullable view parent,

@nonnull string name,

@nonnull context context,

@nonnull attributeset attrs)

else

if(mfactory != null)

else

//...隱藏一些不相干的**

return view;

}catch

(inflateexception e)

}

上述rinflatechildren將會呼叫rinflate方法,原始碼如下所示:

void

rinflate

(xmlpullparser parser, view parent, context context,

attributeset attrs,

boolean finishinflate)

throws xmlpullparserexception, ioexception

final string name = parser.

getname()

;//針對類似「merge、include」標籤的處理

if(tag_request_focus.

equals

(name)

)else

if(tag_tag.

equals

(name)

)else

if(tag_include.

equals

(name)

)parseinclude

(parser, context, parent, attrs);}

else

if(tag_merge.

equals

(name)

)else

}//....

}

上述createviewfromtag方法原始碼如下:

view createviewfromtag

(view parent, string name, context context, attributeset attrs,

boolean ignorethemeattr)

else

}finally

}return view;

//....

}

上述我是從這裡分析的所用的oncreateview方法最終會呼叫create方法,該方法原始碼如下所示:

@nullable

public

final view createview

(@nonnull context viewcontext,

@nonnull string name,

@nullable string prefix,

@nullable attributeset attrs)

throws classnotfoundexception, inflateexception

return view;

//....

}

之後就是重複呼叫上面的方法從而解析完布局內容,完成自定義activity中控制項的填充。

setContentView 後點選事件失效

目錄因專案中用到多個介面,使用單個activity進行桌面切換,切換桌面使用方法為 setcontentview view view 使用該方法可以記錄之前按鍵等的狀態 viewactivityhome layoutinflater.from this inflate r.layout.activi...

官方源 映象源彙總

網易 http 阿里雲 http 上海交通大學 http ftp.sjtu.edu.cn html resources.xml 部分移動運營商出口狀況不佳,無法訪問 華中科技大學 http mirror.hust.edu.cn 當前已用容量估計 4.83t 清華大學 http mirrors.tun...

官方源 映象源彙總

網易 阿里雲 上海交通大學 部分移動運營商出口狀況不佳,無法訪問 華中科技大學 當前已用容量估計 4.83t 清華大學 當前已用容量估計 9.8t 北京理工大學 蘭州大學 中國科技大學 當前已用容量估計 21.32t 大連東軟資訊學院 當前已用容量估計 2.5t 東北大學 大連理工大學 哈爾濱工業大...