ViewStub是一個不可見的、大小為0的控件,運行時ViewStub可以滯后加載。當ViewStub置為可見或者調用inflate()的時候,布局就會加載出來。用加載進來的布局取代ViewStub在父布局中的位置。因此,ViewStub只有在調用了setVisibility()或者inflate()之后,才會在層級中顯示出來。將ViewStub布局參數設置給ViewStub指定加載的布局。同理,你可以用ViewStub的inflatedId定義或者覆蓋ViewStub指定加載的布局id,例如:
<ViewStub
android:id="@+id/stub" android:inflatedId="@+id/subTree" --簡單的說就是可以在此處指定布局文件mySubTree的根id android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />
因此,我們可以通過id “stub”找到ViewStub這個控件,布局資源mySubTree加載完之后,ViewStub就會從它的父布局中移除。我們可以通過“subTree”這個id找到這個由布局資源mySubTree創建的view,通過inflatedId這個屬性找到這個view。加載進來的新布局被指定寬為120dp,高為40dp。這種加載布局資源的方式如下所示:
ViewStub stub = (ViewStub) findViewById(R.id.stub); View inflated = stub.inflate();
當調用inflate方法的時候,加載的布局將取代ViewStub,並且返回這個view的位置。這種方法可以讓應用在不執行findViewById這個方法就可以得到布局的引用。以上翻譯自官網:https://developer.android.com/reference/android/view/ViewStub.html
說了這么多到底怎么使用ViewStub這個控件那???首先我們先說一下使用場景:根據某種狀態,判斷識別並顯示某種布局。簡單點說,就是A狀態下,顯示a布局,B狀態下,顯示b布局。
這種場景大家肯定都遇到過,並且頻繁的改變AB狀態,就可以頻繁的改變ab布局的顯示與隱藏。我們之前的方法是將所有控件全都添加到布局上,然后暫時用不到的隱藏掉,需要的時候在顯示出來。但是這種做法是極其耗資源的,在加載布局的時候,即使你將暫時不用的控件隱藏掉,但還是會加載進來的,從而耗費了資源。這種時候,官網推薦使用的ViewStub這個控件。
ViewStub的優點:它是一個輕量級的View,是一個看不見的,不占布局位置,占用資源非常小的控件。我們可以在ViewStub下指定要加載的布局並指定布局id,當我們需要該布局顯示的時候,只需要調用ViewStub的inflate()即可。或者setVisibility();
ViewStub的缺點:ViewStub的inflate()只能調用一次,多次調用會有異常拋出。也就是說我們只能對ViewStub加載的布局控制一次,若想多次控制該布局,需要使用View的可見性來控制。但是ViewStub的setVisibility()和View的可見性達到的效果是一樣的,並且setVisibility()可以多次調用。
最后我在重申一遍ViewStub的使用背景,對view的顯示只有一次控制的時候,ViewStub是最好的選擇,節省資源。若想多次調用,用View的可見性來實現,用ViewStub的setVisibility()也行。本篇文章參考自http://blog.csdn.net/hitlion2008/article/details/6737537。