ViewStub控件是一個不可見,0尺寸得惰性控件。當ViewStub控件設置可見,或者調用inflate(),并運行完畢之后,ViewStub所指定的layout資源就會被載入。這個ViewStub就會被新載入的layout文件取代。
ViewStub也會從其父控件中移除。
因此ViewStub存在view Hierarchy中的生存期為直到ViewStub運行了setVisable(int)或者inflate()方法。
????在setVisable或者inflate方法運行完成。被載入的Layout文件伴隨著ViewStub的屬性設置一起被增加ViewStub的父控件中。
????你能夠定義或者重寫被載入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”找到。在成功獲取subTree制定的kayout之后,ViewStub就從其父控件中移除了,被載入的mySubTree,能夠通過id“subTree”找到。從以上的代碼屬性設置來說,終于載入的Layout文件,會以寬120dp,高40dp展示。
????通過下面方式,能夠使ViewStub展示出其所代表的layout文件。
? ?ViewStub stub = (ViewStub) findViewById(R.id.stub);View inflated = stub.inflate();
當inflate()運行完畢,Viewstub就被替換掉了,inflate返回的View就是mySubTree這個布局文件的View。所以就不須要運行額外的findById了。
????值得注意的是:ViewStub在Api1的時候就已經提供了,可是在api16的時候,添加了一個方法:
public void?setLayoutInflater?(LayoutInflater?inflater)
這種方法攻克了,不能指定LayoutInflater?的問題,這涉及了Context的使用。
????假設你在低于Api16的開發中,遇到找到不你載入View 的 id的情況,那多數情況是。Context出了問題。在低于api16的情況下,解決方案有兩種:
(1)自己定義ViewStub
(2)在V7包中。使用ViewStubCompat類。
作者有話說:假設你須要或者Android中文API。請掃一掃以下的二維碼,您的關注。就是我的動力。