include
include不多做介绍。主要是可以方便快速复用布局。
- include标签的layout_*属性会替换掉被include视图的根节点的对应属性。
- include标签的id属性会替换掉被include视图的根节点id
但是通过include会引入一个问题。具体代码如下:
主布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<include layout="@layout/merge_test"/>
</RelativeLayout>
merge_test.xml布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="center_horizontal"
android:text="这是第一个"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_gravity="center_horizontal"
android:text="这是第二个"/>
</RelativeLayout>
代码的例子很简单,通过一个xml文件定义了两个左右排列的TextView。
最后文件被一个主布局通过include引入界面。
出现的问题就是这样会多重复嵌套了一层RelativeLayout。如下
多余.png为了解决这个问题,google提供了一个与include配套的标签merge,稍作修改如下
merge_test.xml
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_gravity="center_horizontal"
android:text="这是第一个"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_gravity="center_horizontal"
android:text="这是第二个"/>
</merge>
修改以后运行,界面上不会有任何修改,但是整体结构上却变成了一层RelativeLayout如下:
merge.png下面是一些常用的<merge>标签的注意事项和小技巧
1.merge必须放在布局文件的根节点上。
2.merge并不是一个ViewGroup,也不是一个View,它相当于声明了一些视图,等待被添加。
3.merge标签被添加到A容器下,那么merge下的所有视图将被添加到A容器下。
4.因为merge标签并不是View,所以在通过LayoutInflate.inflate方法渲染的时候, 第二个参数必须指定一个父容器,且第三个参数必须为true,也就是必须为merge下的视图指定一个父亲节点。
5.如果Activity的布局文件根节点是FrameLayout,可以替换为merge标签,这样,执行setContentView之后,会减少一层FrameLayout节点。
6.自定义View如果继承LinearLayout,建议让自定义View的布局文件根节点设置成merge,这样能少一层结点。
7.因为merge不是View,所以对merge标签设置的所有属性都是无效的。
网友评论