ViewStub的使用

    ViewStub是一個不可見的、大小爲0的控件,運行時ViewStub能夠滯後加載。當ViewStub置爲可見或者調用inflate()的時候,佈局就會加載出來。用加載進來的佈局取代ViewStub在父佈局中的位置。所以,ViewStub只有在調用了setVisibility()或者inflate()以後,纔會在層級中顯示出來。將ViewStub佈局參數設置給ViewStub指定加載的佈局。同理,你能夠用ViewStub的inflatedId定義或者覆蓋ViewStub指定加載的佈局id,例如:html

<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。這種加載佈局資源的方式以下所示:java

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

    當調用inflate方法的時候,加載的佈局將取代ViewStub,而且返回這個view的位置。這種方法可讓應用在不執行findViewById這個方法就能夠獲得佈局的引用。以上翻譯自官網:https://developer.android.com/reference/android/view/ViewStub.htmlandroid

    說了這麼多到底怎麼使用ViewStub這個控件那???首先咱們先說一下使用場景:根據某種狀態,判斷識別並顯示某種佈局。簡單點說,就是A狀態下,顯示a佈局,B狀態下,顯示b佈局。佈局

這種場景你們確定都遇到過,而且頻繁的改變AB狀態,就能夠頻繁的改變ab佈局的顯示與隱藏。咱們以前的方法是將全部控件全都添加到佈局上,而後暫時用不到的隱藏掉,須要的時候在顯示出來。可是這種作法是極其耗資源的,在加載佈局的時候,即便你將暫時不用的控件隱藏掉,但仍是會加載進來的,從而耗費了資源。這種時候,官網推薦使用的ViewStub這個控件。spa

    ViewStub的優勢:它是一個輕量級的View,是一個看不見的,不佔佈局位置,佔用資源很是小的控件。咱們能夠在ViewStub下指定要加載的佈局並指定佈局id,當咱們須要該佈局顯示的時候,只須要調用ViewStub的inflate()便可。或者setVisibility();.net

    ViewStub的缺點:ViewStub的inflate()只能調用一次,屢次調用會有異常拋出。也就是說咱們只能對ViewStub加載的佈局控制一次,若想屢次控制該佈局,須要使用View的可見性來控制。可是ViewStub的setVisibility()和View的可見性達到的效果是同樣的,而且setVisibility()能夠屢次調用。翻譯

    最後我在重申一遍ViewStub的使用背景,對view的顯示只有一次控制的時候,ViewStub是最好的選擇,節省資源。若想屢次調用,用View的可見性來實現,用ViewStub的setVisibility()也行。本篇文章參考自http://blog.csdn.net/hitlion2008/article/details/6737537htm

相關文章
相關標籤/搜索