@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 東北大學 大連理工大學 哈爾濱工業大...