抽象布局标签
(1)<include>标签
include标签常用于将布局中的公共部分提取出来供其他layout共用,以实现布局模块化。比如一个APP的顶部布局、侧边栏布局、底部Tab栏布局、ListView和GridView每一项的布局等,将这些同一个APP中有多个界面用到的布局抽取出来再通过include标签引用。
使用方法:在布局文件中需要引用其它布局的地方,使用layout="@layout/child_layout"就可以了。
<include layout="@layout/toolbar"/>
注意事项 :include和其它组件标签(RelativeLayout、LinearLayout、TextView等)一样,都可以使用layout属性来设置布局文件的宽高和位置,但需要注意的是:必须要复写android:layoutwidth和android:layoutheight属性才能使用其它属性(比如:android:layoutgrivity、android:layoutalign...、android:id等),这样可以避免include引用layout中的子组件属性影响到include的布局效果
实际工作中使用
1.新建一个toolbar.xml,用作顶部布局。
head.xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:theme="@style/AppTheme.AppBarOverlay"
app:popupTheme="@style/AppTheme.PopupOverlay"
android:background="?attr/colorPrimary" >
<TextView
android:id="@+id/tv_title"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>
2.新建一个布局文件,命名 activity_main.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">
<include layout="@layout/toolbar"
android:id="@+id/header"/>
<ListView
android:layout_below="@id/header"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
3.activity中代码:
(2)<viewstub>标签
viewstub标签同include标签一样可以用来引入一个外部布局,不同的是,viewstub引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
viewstub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错出现的提示布局等
在java中通过(ViewStub)findViewById(id)找到ViewStub,通过stub.inflate()展开ViewStub,然后得到子View(如下图)
(3)<merge>标签
顾名思义,就是合并、融合的意思。使用它可以有效的将某些符合条件的多余的层级优化掉。使用merge的场合主要有两处:
a. 布局顶结点是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity内容试图的parent view就是个FrameLayout,所以可以用merge消除只剩一个。
b. (Activity中的整体布局,根元素需要是FrameLayout)某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,这样在被引入时顶结点会自动被忽略,而将其子节点全部合并到主布局中。
在使用了include后可能导致布局嵌套过多,多余不必要的layout节点,从而导致解析变慢,不必要的节点和嵌套可通过HierarchyViewer 查看。
以(1) <include>标签的示例为例,用hierarchy viewer查看main.xml布局如下图:
可以发现多了一层没必要的RelativeLayout,将foot.xml中RelativeLayout改为merge,如下: