Android——布局技巧
2020-04-12 本文已影响0人
四喜汤圆
一、作用
二、概念使用
1.抽象布局标签
(1)<include>标签
将布局中的公共部分抽象出来供其他 layout 共用,以实现布局模块化。
该标签唯一需要的属性是layout属性,指定需要包含的布局文件。可以定义android:id和android:layout_属性来覆盖被引入布局根节点的对应属性。注:重新定义android:id后,子布局的顶节点就变化了。
a.布局模块化
<include>中包含的xml在布局时,以整个手机屏幕为参考系。
foot.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>