Android复用layout——include、ViewStub、merge的区别

开始

我们知道Android布局中的include、ViewStub和merge都是为了优化布局使用的,那么这三者有什么区别,他们各适用于什么场合呢?

include

include标签是抽取layout并复用,比如我们App中的标题栏,这时候我们就可以把titlebar的布局提取到一个layout,然后用include标签引用,这样也便于我们日后的统一修改。

<include  
    id="+id/title_bar"
    layout_width="match_parent"
    layout_height="wrap_content"
    layout="@layout/titlebar"/>  

这里需要注意的有:

  • 标签若指定了ID属性,而你的layout也定义了ID,则你的layout的ID会被覆盖,解决方案。
  • 在include标签中所有的Android:layout*都是有效的,前提是必须要写layoutwidth和layout_height两个属性。

ViewStub

ViewStub最大的特点是懒加载,只有当你真正需要的时候才手动促发它的显示,可以起到优化布局加载的作用。比如布局中有一块区域你不想在页面初始化的时候显示,只有用户促发了某些操作后才显示,这时候使用viewStub是非常合适的。

<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"   />  

ViewStub就是一个宽高都为0的一个View,它默认是不可见的,只有通过调用setVisibility函数或者Inflate函数才会将其要装载的目标布局给加载出来.

((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);  
// or  
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();  

这里需要注意的有:

  • findViewById的问题,注意ViewStub中是否设置了inflatedId,如果设置了则需要通过inflatedId来查找目标布局的根元素。

merge

merge标签和其他两个标签不同,include和viewStub是用于引用子layout的,而merge是用在子layout中,用于减少视图层级。例如你的主布局文件是垂直布局,引入了一个垂直布局的include,这是如果include布局使用的LinearLayout就没意义了,使用的话反而减慢你的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>  

现在,当你添加该布局文件时(使用标签),系统忽略节点并且直接添加两个Button。