前言
根据启舰大大 的博客所学习的滑动删除。
一、merge标签:减少冗余的层次从而达到优化UI的目的
<merge/>只能作为XML布局的根标签使用
当Inflate以< merge />开头的布局文件时,必须指定一个父ViewGroup,并且必须设定attachToRoot为true。 必须为TRUE,是因为MERGE标签里没有可用的根结点
section.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你好"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HELLO "/>
</merge>
这个直接预览的页面是这样的
将此页面引用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<include layout="@layout/section"/>
</LinearLayout>
得到的页面是这样子的:
由此,可以看出merge标签能够将该标签中的所有控件直接连在上一级布局上面,从而减少布局层级,也就是说会直接将<merge />内的元素添加到<merge />的父元素里
相当于这样子:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你好"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HELLO "/>
</LinearLayout>
二、LayoutInflater.inflate()
public View inflate(int resource, ViewGroup root, boolean attachToRoot)
- resource: 要将xml转化为view的layout布局
- root: 根结点,作用主要取决于第三个参数
- attachToRoot: 是否将转换后的VIEW直接添加到根结点上。
如果是true,那么在转换出来VIEW之后,内部直接回调用root.addView()将其添加到root结点上,然后返回我们传进去的根结点root;
如果设为false,那么只会将XML布局转换成对应的VIEW,不会将其添加在我们传进去的root结点上,这时,root结点的作用就是在从XML转换布局时,给它提供上层控件的layot_width、layout_height等布局参数,供它产生视图时计算长宽高的位置,由于新产生的视图不依附于root,所以就整个VIEW而言,根结点就是它自己,所以返回值就是XML产生的VIEW本身,注意,设为false这个VIEW是没有被添加进根结点中的。 - 返回值:我们第一个先看返回的VIEW的意义,返回的VIEW指向的根结点
View inflate = getLayoutInflater().inflate(R.layout.section, root, false);
root.addView(inflate);
等价于
getLayoutInflater().inflate(R.layout.section, root, true);