安卓开发之<include /><merge /><viewstub />的使用

本文详细介绍了Android开发中三个重要的布局组件:include用于重用布局,减少代码重复;merge优化布局层级,提升性能;ViewStub实现延迟加载,节省资源。通过实例解析了它们的使用方法及注意事项。

一、include的使用

include 一般用来重用布局文件,当存在多个界面都含有同一个的子布局时,可以使用include来将子布局引入到一个新的布局中。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"   
    android:layout_width=”match_parent”  
    android:layout_height=”match_parent”  
    >  

    <include layout="@layout/titlebar"
             id="@+id/titlebar"/>  
  1. include中的指定布局xml中使用的是layout属性,不是android:layout属性。

  2. include中的id属性设置的是提取出来的重复布局中的根元素id。

  3. 对于不同界面中的相同元素,一般来说它们的控件属性是不同的,这时候我们需要去修改属性。修改includes布局属性:直接指定属性,原有的属性会被覆盖。例如 <include/> 标签若指定了ID属性,而你的layout也定义了ID,则你的layout的ID会被覆盖。修改include布局里的子控件属性:通过findViewById找到相应控件

    //根据include中的id获取到布局View
    View titleBar = findViewById(R.id.titlebar) ;
    
    //设置titlebar布局里的一个TextView
    TextView titleTextView = (TextView)titleBar.findViewById(R.id.title_tv) ;
    
    titleTextView.setText("new Title");
    

二、merge的使用

<merge/> 一般用来减少在include布局文件时的层级,一般用于在include时子布局的根视图与子布局的父视图是同一类型。

1.  merge一般与include配合使用,include标签可以导入提取的重复布局,而如果将被导入的布局使用 merge 作为根节点表示,这样当被嵌入父级结构中后可以将它所包含的子集融合到父级结构中,而不会出现冗余的节点。

2.  <merge/>只可以作为布局xml的根节点,其就像临时的一个套件,需要将内部的东西转移到一个Layout里面,作用是 将`<merge/>` 里面的内容直接插入到xml结构中。

3.  当你的主布局文件是垂直布局,引入了一个垂直布局的include,这时如果include布局使用的LinearLayout就没意义了,使用的话反而减慢你的UI表现。这时可以使用`<merge/>`标签优化。


2.  当需要扩充的xml layout本事是由merge作为根节点的话,需要将被导入的xml layout置于viewGroup中,同时需要设置attachToRoot为True,也就是一定要有根布局存放merge中的内容。

    inflate(int resource, ViewGroup root, boolean attachToRoot)

3.  使用Merge优化是指 将<merge />内的元素添加到<merge />的父元素里

4.  Activity内容视图的顶层布局是FrameLayout

三、ViewStub

ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件。可以为ViewStub指定一个布局。在Inflate布局的时候,只有ViewStub会被初始化,里面的布局不会被初始化。

  1. 一般用于一些延迟加载的布局视图/条件判断后是否要的布局视图,可以用于显示一些提示引导的布局,需要提示引导时,解析ViewStub,不需要时布局也不会加载出来。

  2. 与View.Gone的区别:ViewStub达到一个减少耗费内存等资源的效果,对于一开始就想设置View.Gone的布局可以用ViewStub指定。(View的初始可见View.GONE但是在Inflate布局的时候View仍然会被解析)

<ViewStub   
    android:id="@+id/viewstub_layout"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:layout_marginLeft="5dip"  
    android:layout_marginRight="5dip"  
    android:layout_marginTop="10dip"  
    android:layout="@layout/viewstub_layout"/>  

当你准备inflate ViewStub时,调用inflate()方法即可。或者设定ViewStub的Visibility为VISIBLE或INVISIBLE,也会触发inflate。注意的是,使用inflate()方法返回的是布局文件的根元素。

((ViewStub)findViewById(R.id.viewstub_layout)).setVisibility(View.VISIBLE);
// or 解析成View
View importPanel =((ViewStub)findViewById(R.id.viewstub_layout)).inflate();

ViewStub解析后,ViewStub从视图树中消失了,取而代之的是layout属性对应的布局文件中的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值