ViewStub 是一個不可見的,大小為0的View,最佳用途就是實現View的延遲加載,在需要的時候再加載View,可Java中常見的性能優化方法延遲加載一樣。
當調用ViewStub的setVisibility函數設置為可見或則調用inflate初始化該View的時候,ViewStub引用的資源開始初始化,然後引用的資源替代ViewStub自己的位置填充在ViewStub的位置。因此在沒有調用setVisibility(int) 或則 inflate()函數之前ViewStub一種存在組件樹層級結構中,但是由於ViewStub非常輕量級,這對性能影響非常小。可以通過ViewStub的inflatedId屬性來重新定義引用的layout id。 例如:
<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
上面定義的ViewStub ,可以通過id “stub”來找到,在初始化資源“mySubTree”後,stub從父組件中刪除,然後"mySubTree"替代stub的位置。初始資源"mySubTree"得到的組件可以通過inflatedId 指定的id "subTree"引用。 然後初始化後的資源被填充到一個120dip寬、40dip高的地方。www.aiwalls.com
推薦使用下面的方式來初始化ViewStub:
ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate();
當調用inflate()函數的時候,ViewStub 被引用的資源替代,並且返回引用的view。 這樣程序可以直接得到引用的view而不用再次調用函數 findViewById()來查找瞭。
ViewStub目前有個缺陷就是還不支持 <merge /> 標簽。。。
摘自 心飛揚