天天看點

Android_ViewStub

public final class ViewStub extends View

  •  java.lang.Object
    • android.view.View
      • android.view.ViewStub

類摘要:

ViewStub 是一個隐藏的,不占用記憶體空間的視圖對象,它可以在運作時延遲加載布局資源檔案。當 ViewStub 可見,或者調用 inflate()函數時,才會加載這個布局資源檔案。該

ViewStub 在加載視圖時在父容器中替換它本身。是以,ViewStub 會一直存在于視圖中,直到調用 setVisibility(int) 或者 inflate()為止。ViewStub 的布局參數會随着加載的視圖

數一同被添加到 ViewStub 父容器。

同樣,你也可以通過使用 inflatedId 屬性來定義或重命名要加載的視圖對象的 Id 值。

例如:

<ViewStub
        android:id="@+id/stub"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:inflatedId="@+id/subTree"
        android:layout="@layout/mySubTree" />
           

通過"stud"id 可以找到被定義的 ViewStub 對象。加載布局資源檔案"mySubTree "後,ViewStub 對象從其父容器中移除。可以通過 id"subTree"找到由布局資源"mySubTree"建立的View。這個視圖對象最後被指定為寬 100dip,高 100dip。執行加載布局資源檔案的推薦方式

如下:

ViewStub stub = findViewById(R.id.stub);
View inflated = stub.inflate();
           

當 inflate()被調用,  這個 ViewStub 被加載的視圖替代并且傳回這個視圖對象。這使得應用程式不需要額外執行 findViewById()來擷取加載視圖的引用。

這個類大概意思是用 ViewStub 類和在 XML 檔案裡面指定的布局資源檔案關聯起來,讓布局資源檔案在需要使用的時候再加載上去。主要作用是性能優化,什麼時候用什麼時候加載,不用在開始啟動的時候一次加載,既可以加快程式的啟動速度,又可以節省記憶體資源

嵌套類

接口ViewStub.OnInflateListener 

一個用于接收 ViewStub 已經成功加載布局資源檔案的通知的監聽器。

XML 屬性

屬性名稱 相關方法 描述
android:inflatedId      setInflatedId(int)  覆寫待加載視圖的 id 值。
android:layout  setLayoutResource(int)     要引用的布局資源檔案 id    

構造函數

ViewStub(Context context, int layoutResource)

建立一個與指定的布局資源檔案關聯的 ViewStub 對象。

參數layoutResource    要加載的布局資源檔案的 id 值。

公共方法

public void draw (Canvas canvas)

參數canvas  這個畫布傳到那個已渲染的視圖對象。

手動在指定的畫布繪制這個視圖(及所有其子視圖)。這個視圖必須在調用這個函數之前做好了整體布局。

當要自己實作一個視圖時,不要重載這個方法;相反,你應該重載onDraw(Canvas)方法。

主要用于自定義的視圖元件的方法 

public int getInflatedId ()

傳回加載的布局資源檔案的 ID,如果加載的布局資源檔案的 id是 NO_ID,那麼這個加載的 View 将保留它原來的 id 值。

相關 XML  屬性:android:inflatedId

傳回值:一個正整數來辨別這個要加載的視圖或者 NO_ID 将保持加載視圖原來的 id。

參見setInflatedId(int)

public int getLayoutResource ()

傳回加載的布局資源檔案的 id 值。

相關 XML  屬性:android:layout

傳回值:加載到視圖對象的布局資源檔案 id 值。

參見

  • setLayoutResource(int)
  • setVisibility(int)
  • inflate()
public View inflate ()

加載 getLayoutResource()方法辨別的布局資源,并通過 加載布局資源替換父容器中它自己。

傳回值:這個已加載的布局資源檔案. 

public void setInflatedId (int inflatedId)

參數inflatedId: 一個正整數來辨別這個加載視圖或者 NO_ID 将保持加載視圖原來的 id。

設定加載視圖的 ID。如果這個 id 為 NO_ID,這個加載視圖保持它原來的 id 不變。

相關 XML  屬性:android:inflatedId

參見getInflatedId()

public void setLayoutResource (int layoutResource)

參數layoutResource:  一個有效的布局資源檔案 id 值(不等于 0)。

設定待加載的布局資源檔案,當 ViewStub 被設定為 visible 或 invisible 或調用 inflate()時使用。這個在加載布局資源檔案時建立的視圖用來 在父容器中替換它自己。

相關 XML  屬性:android:layout

參見

  • getLayoutResource()
  • setVisibility(int)
  • inflate()
public void setOnInflateListener (ViewStub.OnInflateListener inflateListener)

參數inflateListener:  該 OnInflateListener 在成功加載後得到事件通知。

設定成功加載布局資源檔案後事件通知的監聽器。

參見ViewStub.OnInflateListener

public void setVisibility (int visibility)

參數visibility  設定為 VISIBLE(顯示), INVISIBLE(隐藏),  或 GONE(完全隐藏,不暫用布局位置)

當可見性設定為 VISIBLE 或 INVISIBLE,inflate()将被調用,并且加載視圖資源在父容器中

替換 ViewStub。

參見inflate()

受保護方法

protected void dispatchDraw (Canvas canvas)

調用這個函數去繪制這個控件的子視圖。可以通過派生類重寫在繪制子類之前擷取控制(但是是在他自己的視圖已經被繪制完之後)

參數canvas  這個畫布傳到那個已渲染的視圖對象。

protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)

參數

  • widthMeasureSpec  由于父類有橫向空間要求,參見 View.MeasureSpec。
  • heightMeasureSpec  由于父類有縱向空間要求,參見 View.MeasureSpec。

測量這個視圖以确定其内容的高度和寬度。通過 measure(int, int)來調用這個方法,并且應該由子類重寫以提高内容測量的效率和精确度。

約定:當該方法被重寫時,你必須調用 setMeasuredDimension(int, int)來存儲已測量視圖的高度和寬度。否則将通過 measure(int, int)抛出一個 IllegalStateException 異常

調用父類的 onMeasure(int, int)方法是一個有效的辦法。父類的實作是以背景大小為預設大小,除非 MeasureSpec(測量細則)允許更大的背景。   為了更好測量内容子類應該重寫 onMeasure(int, int)。

如果這個方法被重寫,子類有責任確定測量它的高度和寬度至少是視圖的最小寬度和高度(getSuggestedMinimumHeight()和 getSuggestedMinimumWidth())。