原文地址:http://android.xsoftlab.net/training/improving-layouts/loading-ondemand.html
有時應用程序中會有一些很少用到的複雜佈局。在需要它們的時候再加載可以降低內存的消耗,同時也可以加快界面的渲染速度。
定義ViewStub
ViewStub是一個輕量級的View,它沒有高寬,也不會繪製任何東西。所以它的加載與卸載的成本很低。每個ViewStub都可以使用android:layout屬性指定要加載的佈局。
下面這個ViewStub用於一個半透明的ProgressBar的加載。它只有在新工作開始時纔會顯示。
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
加載ViewStub
當需要加載由ViewStub所指定的佈局時,可以使用setVisibility(View.VISIBLE)方法或者inflate()方法,兩者效果相同。
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
Note: inflate()方法會在加載完畢的時候返回一個View。所以不需要使用findViewById()來查找這個佈局的Root View。
一旦ViewStub所託管的View被加載,那麼ViewStub將不再是View層級的一部分。它會被所加載的佈局替換,並且會將該佈局的ID更改爲ViewStub的android:inflatedId屬性所指定的ID。
Note: ViewStub的缺點是:它當前並不支持要加載佈局的root View爲< merge/>標籤。