標籤:
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,請掃一掃下面的二維碼,您的關注,就是我的動力。
Android中文API-ViewStub