?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
ViewStub
版本:Android 2.2 r1
?
public final class ViewStub extends View
?
java.lang.Object
android.view.View
? ???? android.view.ViewStub
?
類摘要:
ViewStub 是一個(gè)隱藏的,不占用內(nèi)存空間的視圖對(duì)象,它可以在運(yùn)行時(shí)延遲加載布局資源文件。當(dāng)ViewStub可見,或者調(diào)用 inflate()函數(shù)時(shí),才會(huì)加載這個(gè)布局資源文件。 該ViewStub在加載視圖時(shí)在父容器中替換它本身。因此,ViewStub會(huì)一直存在于視圖中,直到調(diào)用setVisibility(int) 或者inflate()為止。ViewStub的布局參數(shù)會(huì)隨著加載的視圖數(shù)一同被添加到ViewStub父容器。同樣,你也可以通過使用inflatedId屬性來定義或重命名要加載的視圖對(duì)象的Id值。例如:
通過"stud"id可以找到被定義的ViewStub對(duì)象。加載布局資源文件"mySubTree "后, ViewStub對(duì)象從其父容器中移除??梢酝ㄟ^id"subTree"找到由布局資源"mySubTree"創(chuàng)建的View。這個(gè)視圖對(duì)象最后被指定為寬120dip,高40dip。執(zhí)行加載布局資源文件的推薦方式如下:
???????? ?
當(dāng)inflate()被調(diào)用, 這個(gè)ViewStub被加載的視圖替代并且返回這個(gè)視圖對(duì)象。這使得應(yīng)用程序不需要額外執(zhí)行findViewById()來獲取加載視圖的引用。
???????? (譯者注:這個(gè)類大概意思是用ViewStub類和在XML文件里面指定的布局資源文件關(guān)聯(lián)起來,讓布局資源文件在需要使用的時(shí)候再加載上去。主要作用是性能優(yōu)化,什么時(shí)候用什么時(shí)候加載,不用在開始啟動(dòng)的時(shí)候一次加載,既可以加快程序的啟動(dòng)速度,又可以節(jié)省內(nèi)存資源。)
?
嵌套類
???????? 接口???????? ViewStub.OnInflateListener???????????? 一個(gè)用于接收ViewStub已經(jīng)成功加載布局資源文件的通知的監(jiān)聽器。
?
XML屬性
屬性名稱 |
相關(guān)方法 |
描述 |
android:inflatedId |
setInflatedId(int) |
覆蓋待加載視圖的id值。 |
android:layout |
setLayoutResource(int) |
為待加載的資源視圖提供一個(gè)標(biāo)識(shí),在ViewStub變?yōu)榭梢娀颢@取焦點(diǎn)時(shí)使用它。(譯者注:要引用的布局資源文件id) |
?
構(gòu)造函數(shù)
???????? ViewStub(Context context, int layoutResource)
???????? 創(chuàng)建一個(gè)與指定的布局資源文件關(guān)聯(lián)的ViewStub對(duì)象。
?????????????????? 參數(shù)
??????????????????????????? layoutResource?? 要加載的布局資源文件的id值。
?
公共方法
???????? public void draw (Canvas canvas)
???????? 手動(dòng)在指定的畫布繪制這個(gè)視圖(及所有其子視圖)。這個(gè)視圖必須在調(diào)用這個(gè)函數(shù)之前做好了整體布局。當(dāng)要自己實(shí)現(xiàn)一個(gè)視圖時(shí),不要重載這個(gè)方法;相反,你應(yīng)該重載onDraw(Canvas)方法。(譯者注:主要用于自定義的視圖組件的方法。)
?????????????????? 參數(shù)
??????????????????????????? canvas ?? 這個(gè)畫布傳到那個(gè)已渲染的視圖對(duì)象。
?
???????? public int getInflatedId ()
???????? 返回加載的布局資源文件的ID,如果加載的布局資源文件的id是NO_ID,那么這個(gè)加載的View將保留它原來的id值。
?????????????????? 相關(guān)XML 屬性
??????????????????????????? android:inflatedId
?????????????????? 返回值
??????????????????????????? 一個(gè)正整數(shù)來標(biāo)識(shí)這個(gè)要加載的視圖或者NO_ID將保持加載視圖原來的id。
?????????????????? 參見
??????????????????????????? setInflatedId(int)
?
???????? public int getLayoutResource ()
???????? 返回加載的布局資源文件的id值。
?????????????????? 相關(guān)XML 屬性
??????????????????????????? android:layout
?????????????????? 返回值
??????????????????????????? 加載到視圖對(duì)象的布局資源文件id值。
?????????????????? 參見
??????????????????????????? setLayoutResource(int)
??????????????????????????? setVisibility(int)
??????????????????????????? inflate()
?
???????? public View inflate ()
???????? 加載getLayoutResource()方法標(biāo)識(shí)的布局資源,并通過加載布局資源替換父容器中它自己。
?????????????????? 返回值
??????????????????????????? 這個(gè)已加載的布局資源文件.
?
???????? public void setInflatedId (int inflatedId)
???????? 設(shè)置加載視圖的ID。如果這個(gè)id為NO_ID,這個(gè)加載視圖保持它原來的id不變。
?????????????????? 相關(guān)XML 屬性
??????????????????????????? android:inflatedId
?????????????????? 參數(shù)
??????????????????????????? inflatedId ??????? 一個(gè)正整數(shù)來標(biāo)識(shí)這個(gè)加載視圖或者NO_ID將保持加載視圖原來的id。
?????????????????? 參見
??????????????????????????? getInflatedId()
?
???????? public void setLayoutResource (int layoutResource)
???????? 設(shè)置待加載的布局資源文件,當(dāng)ViewStub被設(shè)置為visible或invisible或調(diào)用inflate()時(shí)使用。這個(gè)在加載布局資源文件時(shí)創(chuàng)建的視圖用來在父容器中替換它自己。
?????????????????? 相關(guān)XML 屬性
??????????????????????????? android:layout
?????????????????? 參數(shù)
??????????????????????????? layoutResource ????? 一個(gè)有效的布局資源文件id值(不等于0)。
?????????????????? 參見
??????????????????????????? getLayoutResource()
??????????????????????????? setVisibility(int)
??????????????????????????? inflate()
?
???????? public void setOnInflateListener (ViewStub.OnInflateListener inflateListener)
設(shè)置成功加載布局資源文件后事件通知的監(jiān)聽器。
?????????????????? 參數(shù)
??????????????????????????? inflateListener ??????? 該OnInflateListener在成功加載后得到事件通知。
?????????????????? 參見
??????????????????????????? ViewStub.OnInflateListener
?
???????? public void setVisibility (int visibility)
當(dāng)可見性設(shè)置為VISIBLE或INVISIBLE,inflate()將被調(diào)用,并且加載視圖資源在父容器中替換ViewStub。
?????????????????? 參數(shù)
??????????????????????????? visibility 設(shè)置為VISIBLE(顯示), INVISIBLE(隱藏), 或 GONE(完全隱藏,不暫用布局位置).
?????????????????? 參見
??????????????????????????? inflate()
?
受保護(hù)方法
???????? protected void dispatchDraw (Canvas canvas)
調(diào)用這個(gè)函數(shù)去繪制這個(gè)控件的子視圖。可以通過派生類重寫在繪制子類之前獲取控制(但是是在他自己的視圖已經(jīng)被繪制完之后)
???????? ???????? 參數(shù)
?????????????????? ???????? canvas ?? 這個(gè)畫布傳到那個(gè)已渲染的視圖對(duì)象。
?
???????? protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
???????? 測(cè)量這個(gè)視圖以確定其內(nèi)容的高度和寬度。通過measure(int, int)來調(diào)用這個(gè)方法,并且應(yīng)該由子類重寫以提高內(nèi)容測(cè)量的效率和精確度。
約定:當(dāng)該方法被重寫時(shí),你必須調(diào)用setMeasuredDimension(int, int)來存儲(chǔ)已測(cè)量視圖的高度和寬度。否則將通過measure(int, int)拋出一個(gè)IllegalStateException異常。調(diào)用父類的onMeasure(int, int)方法是一個(gè)有效的辦法。
父類的實(shí)現(xiàn)是以背景大小為默認(rèn)大小,除非MeasureSpec(測(cè)量細(xì)則)允許更大的背景。? 為了更好測(cè)量內(nèi)容子類應(yīng)該重寫onMeasure(int, int)。
如果這個(gè)方法被重寫,子類有責(zé)任確保測(cè)量它的高度和寬度至少是視圖的最小寬度和高度(getSuggestedMinimumHeight()和getSuggestedMinimumWidth())。
參數(shù)
widthMeasureSpec ??????? 由于父類有橫向空間要求,參見View.MeasureSpec。
??????????????????????????? heightMeasureSpec ?????? 由于父類有縱向空間要求,參見View.MeasureSpec。