標籤:
android開發當中,我們經常會遇到根據某個條件去控制一個控制項的顯示/隱藏的情況。雖然setVisibility(int visibility)的確可以達到這樣的目的,但是在渲染時,其實隱藏的布局也會執行inflate()方法,造成額外的資源開支(記憶體),針對這種情況更好的做法就是使用ViewStub這個對象。
根據官網上的描述,ViewStub是一個不可見的(invisible),不佔任何空間(zero-sized)的可以用來延時渲染的View對象。我們在布局中可以給他設定layout參數,指定想要替換的布局檔案。當我們調用ViewStub的inflate() 或者 setVisibility()方法時,ViewStub將被指定的layout所替代,並且新的view將繼承該ViewStub的布局參數。
簡單的樣本:
<ViewStub android:id="@+id/stub" android:inflatedId="@+id/subTree" android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />
布局中,mySubTree就是我們想要延時渲染的視圖。在我們調用inflate()方法後,新渲染的視圖會繼承ViewStub的布局參數,即,mySubTree這個布局的實際寬高將分別是120dp和40dp。新渲染的視圖id將是我們指定的 subTree(對應上面布局中的inflatedId="@+id/subTree")
實際上也沒必要再去調用findViewById(int),官方推薦的做法是
ViewStub stub = (ViewStub) findViewById(R.id.stub); View inflated = stub.inflate();
inflated就是我們新產生的視圖對象。
我們也可以通過setInlfateListener(ViewStub.onInflateListener listener)綁定監聽器, 在渲染完成時通過回調對該view進行一些操作。(比如顯示指定資料?)
android ViewStub延時渲染的應用