一、作用
二、概念使用
1.抽象布局标签
(1)<include>
标签
将布局中的公共部分抽象出来供其他 layout 共用,以实现布局模块化。
该标签唯一需要的属性是layout
属性,指定需要包含的布局文件。可以定义android:id
和android:layout_
属性来覆盖被引入布局根节点的对应属性。注:重新定义android:id
后,子布局的顶节点就变化了。
a.布局模块化
foot.xml
<include>
中包含的xml
在布局时,以整个手机屏幕为参考系。
// foot.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"
android:orientation="vertical">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_above="@+id/tv" />
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:gravity="center"
android:text="哈哈哈" />
</RelativeLayout>
b.引入模块化的布局
(2)<viewStub>
标签
该标签和<include>
一样,可以用来引入一个外部布局。<viewStub>
引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout
时节省 cpu 和内存。
<viewStub>
常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错时显示的提示布局等。
【示例】
a.将无网络出错时的提示布局模块化
b.引入主布局中
c.在主布局中显示/隐藏
private void showNetError() {
if (networkErrorView != null) {
networkErrorView.setVisibility(View.VISIBLE);
return;
}
ViewStub stub = findViewById(R.id.optimization_layout_network_error);
networkErrorView = stub.inflate();
mSettingBtn = networkErrorView.findViewById(R.id.network_setting_btn);
mRefreshBtn = networkErrorView.findViewById(R.id.network_refresh_btn);
}
private void showNormal() {
if (networkErrorView != null) {
networkErrorView.setVisibility(View.GONE);
}
}
https://www.jianshu.com/p/40b0445477e9
(3)<merge>
标签
在使用了<include>
后可能导致布局嵌套过多,多余不必要的layout
节点,从而导致解析变慢。
该标签可用于两种典型场景:
- 布局根节点是
FrameLayout
且不需要设置background
和padding
等属性,可以用merge
代替
因为 Activity 内容视图的 parent view 就是一个 FrameLayout ,可以用merge
消除一个
- 某布局作为子布局,被其他布局
include
时,使用merge
当做该布局的根节点
这样在被引入时根节点会自动被忽略,而将其子节点全部合并到主布局中。
上述foot.xml
中可以用merge
代替RelativeLayout
<?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"
android:orientation="vertical">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_above="@+id/tv" />
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:gravity="center"
android:text="哈哈哈" />
</merge>
网友评论