在布局优化中,Android的官方提到了这三种布局<include/>,<merge/>,<ViewStub/>,并且介绍了这三种布局的优势,下面简单介绍下:
###布局重用<include/>:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background="@color/app_bg"
android:gravity="center_horizontal">
<include layout="@layout/titlebar"/>
<TextView android:layout_width=”match_parent”
android:layout_height="wrap_content"
android:text="@string/hello"
android:padding="10dp" />
</LinearLayout>
<include/>标签中可以添加属性覆盖重用的布局。一般可以覆盖以下几个属性:android:id,android:layout_*。
###减少视图层级<merge/>
<merge/>标签在UI的结构优化中起着非常重要的作用,它可以减少多余的层级。<merge/>多用于替换FrameLayout或者当一个布局包含另一个时,<merge/>标签消除视图层次结构中多余的视图。多余的视图会减慢你的UI表现。
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/>
</merge>
使用<merge/>标签时,必须让<merge/>标签本身表示的Layout和parent表示的Layout是一样的,比如<merge/>标签本身代表的是FrameLayout,而parent使用的是LinearLayout,这时候就不可以把<merge/>标签应用到该LinearLayout中。具体请参考Android Developers’ blog
该标签还可以和<include/>标签一起使用,我们使用下面的示例来说明:
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:okCancelBar="http://schemas.android.com/apk/res/com.example.android.merge">
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="center"
android:src="@drawable/golden_gate" />
<com.example.android.merge.OkCancelBar
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:paddingTop="8dip"
android:gravity="center_horizontal"
android:background="#AA000000"
okCancelBar:okLabel="Save"
okCancelBar:cancelLabel="Don't save" />
</merge>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<include
layout="@layout/okcancelbar_button"
android:id="@+id/okcancelbar_ok" />
<include
layout="@layout/okcancelbar_button"
android:id="@+id/okcancelbar_cancel" />
</merge>
###需要时使用<ViewStub/>
<ViewStub/>标签最大的优点是当你需要时才会加载,使用它并不会影响UI初始化时的性能。各种不常用的布局像进度条、显示错误消息等可以使用该标签。
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />