多虧了<include />標籤,在Android裏,很容易就能作到共享和重用UI組件。在Android開發中,很容易就能建立出複雜的UI結構,結果呢,用了不少的View,且其中的一些不多使用。針對這種狀況,謝天謝地,Android還爲咱們提供了一個特別的構件——ViewStub,它可使你充分享受<include />的好處而不會形成無用View的浪費。android
ViewStub是一個看不見的,輕量級的View。它沒有尺寸,也不會繪製以及以某種形式參與到佈局中來。這意味着ViewStub去inflate以及保留在View層次中的代價是很廉價的。ViewStub最佳的描述稱之爲「懶惰的include」。ViewStub中引用的佈局只在你想添加到UI上時纔會顯示。編程
下面的截圖來自於Shelves應用程序。圖中Activity顯示的內容是給用戶呈現可瀏覽的書籍列表:佈局
相同的Activity也用於用戶添加或導入新的書籍。在這個操做中,Shelves顯示了一個額外的UI。下面的截圖顯示了在導入期間,會在屏幕的底部顯示一個進度表和一個取消按鈕:blog
因爲導入書籍不是一個常有的操做,至少相對於瀏覽書籍列表來講不是,所以,導入panel由ViewStub來承載:開發
當用戶進行一個導入操做時,ViewStub被inflate,此時由它引用的佈局文件內容替代顯示:it
爲了使用ViewStub,你全部須要作的是指定android:id特性,便於之後inflate,指定android:layout特性,引用佈局文件。ViewStub還容許你使用第三個特性,android:inflatedId,你可使用它來重寫包含的佈局文件中的根元素的id。最後,在ViewStub上設定的layout_*參數將會應用到包含的佈局文件的頂部。這裏有個例子:import
<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" />
當你準備inflate ViewStub時,調用inflate()方法便可。你還能夠設定ViewStub的Visibility爲VISIBLE或INVISIBLE,也會觸發inflate。注意的是,使用inflate()方法能返回佈局文件的根View:書籍
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
有一點須要記住的是:當ViewStub inflate後,這個ViewStub就從View層次中移除了。所以,沒有必要保留一個對ViewStub的引用(如在類的字段裏)。引用
ViewStub是快捷編程與高效編程之間的產物。與其手動的inflate View並在運行時添加到View層次上,不如簡單的使用ViewStub。它至關「廉價」且易於使用。ViewStub惟一的缺點是如今不支持<merge />標籤。程序