Merge、ViewStub標籤總結

一個暱稱而已T發表於2017-11-17

1、Merge

作用:直接將其中的子元素新增到Merge標籤的Parent中,避免引入額外的層級。

使用時的要求:

(1)Merge只能用在佈局XMl檔案的根元素;
(2)使用Merge來載入一個佈局時,必須指定一個ViewGroup作為其父元素,並且要設定載入的attachToRoot引數為true(參照inflate(int,ViewGroup,boolean));
(3)不能在ViewStub中使用,因為ViewStub的inflate方法中根本沒有attachToRoot的設定。

具體使用:

先定義需要的佈局檔案(test_merge.xml):

<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="Test Merge 1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:text="Test Merge 2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</merge>

然後在其他檔案中引用:

<include layout="@layout/merge_test"/>

也可以在自定義的View的佈局檔案中使用,此時需要將自定義View對應的佈局檔案的根結點換成merge標籤,然後在引用的佈局檔案中直接正常引用該自定義View即可。


2、ViewStub

作用:ViewStub是一個輕量級的View,它是一個看不見的,並且不佔佈局位置的,佔用資源非常小的物件。可以為ViewStub指定一個佈局,載入佈局時,只有ViewStub會被初始化,然後當ViewStub被設定為可見時,或者呼叫了ViewStub.inflate()時,ViewStub所指向的佈局會被載入和實力化,然後ViewStub的佈局屬性都會傳給它指向的佈局。

具體使用:(事先實現定義了一個供使用的佈局檔案viewstub_test)
然後在XML佈局檔案中引用:

<ViewStub
    android:id="@+id/viewstub"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout="@layout/viewstub_test"/>

之後在Java程式碼中的具體邏輯處載入:

ViewStub stub = findViewById(R.id.viewstub);

stub.inflate();//載入佈局檔案例項
stub.setVisibility(View.GONE);//隱藏

其中inflate()方法只能呼叫一次,用於載入初始化佈局(也可以直接使用setVisibility(View.VISIBILITY),如果再次呼叫會出異常java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent,之後可用setVisibility()設定其可見性。如果直接呼叫setVisibility(View.INVISIBILITY)會在第一次呼叫時將佈局顯示出來,之後的正常將佈局隱藏。無論是setVisibility(View.VISIBILITY)還是第一次呼叫setVisibility(View.INVISIBILITY),如果之後再次呼叫inflate()都會出現異常。

需要注意的:

(1)ViewStub只能用來載入一個佈局檔案,而不是具體的某個View,當然也可以把單獨的View放到佈局檔案中。如果想操作一個具體的View,還是使用visibility屬性。
(2)ViewStub中不能巢狀Merge標籤。

相關文章