一脓恕、使用<include>標(biāo)簽重用布局
eg:一個(gè)公用的布局common.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#ccc"
android:layout_height="50dp">
<TextView
android:layout_centerInParent="true"
android:textSize="16sp"
android:text="標(biāo)題"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
在需要重用此布局的地方
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mh.demoperformance.MainActivity">
<include layout="@layout/common"/>
</RelativeLayout>
效果圖
使用include 引入一個(gè)布局文件匾灶,include標(biāo)簽除了可以指定id之外,
只能使用android:layout_開(kāi)頭的屬性谎势,而且只要
指定了android:layout_這種屬性就必須要寫
上android:layout_height和android:layout_width,否者
其他的android:layout_屬性都無(wú)效,一旦在include 中
指定了android:layout_height和android:layout_width之
后,被include 進(jìn)來(lái)的布局的根元素的android:layout_height和
android:layout_width將無(wú)效,寬高將和include里面的保持一致汰扭,
修改布局后:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mh.demoperformance.MainActivity">
<include
android:layout_height="match_parent"
android:layout_width="match_parent"
layout="@layout/common"/>
</RelativeLayout>
效果圖
同理如果include 里面寫了id標(biāo)簽,被include 的布局的根元素
也指定了id標(biāo)簽福铅,那么將以inclide的id標(biāo)簽為準(zhǔn)
二萝毛、使用<merge>標(biāo)簽合并布局
一般在使用<include>標(biāo)簽的時(shí)候會(huì)引入多余的嵌套布局,
比如在上面的例子中滑黔,布局和被嵌套的布局的最外層都
使用了RelativeLayout,所以被嵌套的布局的RelativeLayout是
多余的笆包,所以<merge>標(biāo)簽一般和<include>標(biāo)簽一起使用
來(lái)減少布局層級(jí)修改common.xml布局
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_centerInParent="true"
android:textSize="16sp"
android:text="標(biāo)題"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</merge>
這樣就去除了多余的RelativeLayout 布局嵌套
merge的一些特性:
- merge必須放在布局文件的根節(jié)點(diǎn)上。
- merge并不是一個(gè)View略荡,只是聲明了一些視圖庵佣,等待被添加。
所以對(duì)merge標(biāo)簽設(shè)置的所有屬性都是無(wú)效的汛兜。如果通
過(guò)LayoutInflate.inflate方法渲染秧了, 第二個(gè)參數(shù)必須指定
一個(gè)父容器,且第三個(gè)參數(shù)必須為true序无。
貼一篇作者 江南一點(diǎn)雨 LayoutInflate.inflate的文章
(http://blog.csdn.net/u012702547/article/details/52628453) - 如果Activity的布局根節(jié)點(diǎn)是FrameLayout验毡,可以替換
為merge標(biāo)簽,這樣執(zhí)行setContentView之后帝嗡,會(huì)減少
一層FrameLayout節(jié)點(diǎn)晶通。
三、使用<ViewStub>按需加載布局
在實(shí)際開(kāi)發(fā)中很多布局我們并不是一開(kāi)始就需要加載的
哟玷,通常我們可以使用顯示和隱藏來(lái)實(shí)現(xiàn)狮辽。但是這樣
隱藏的布局在一開(kāi)始的時(shí)候就已經(jīng)參與繪制了,
會(huì)影響繪制的效率巢寡。而VIewStub本事繼承了View,
它的寬和高都是0喉脖,自身并不參與繪制。當(dāng)我們需要
顯示的時(shí)候才去加載進(jìn)來(lái)抑月,能提高程序的初始化性能树叽。
一個(gè)需要按需加載的布局文件viewstub.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:textSize="16sp"
android:text="點(diǎn)擊重新加載"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ccc"
tools:context="com.mh.demoperformance.MainActivity">
<ViewStub
android:layout_centerInParent="true"
android:id="@+id/viewstub"
android:layout="@layout/common"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
在需要顯示的時(shí)候
ViewStub viewStub = (ViewStub) findViewById(R.id.viewstub);
viewStub.inflate();
或者
mViewStub = (ViewStub) findViewById(R.id.viewstub);
mViewStub.setVisibility(View.VISIBLE);
當(dāng)調(diào)用infalte或者ViewStub.setVisibility(View.VISIBLE);時(shí),
先從父視圖上把當(dāng)前ViewStub刪除谦絮,再把加載的android:layotu視圖添加上
四题诵、LinearLayout增加divider分割線
如果我們要給LinearLayout 添加如下圖的分割線洁仗,通常我們可以
在每一項(xiàng)中間添加一個(gè)View,設(shè)置view的寬高性锭,和背景赠潦,
但是這樣不僅浪費(fèi)資源而且還繁瑣,
在android3.0及后面的版本給LinearLayout添加分割線我們可以這樣做:
1)在drawable文件下新建shape_divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#e70303" />
<size android:height="1dp" />
</shape>
2)在LinearLayout中添加
android:showDividers="middle"
android:divider="@drawable/shape_divider"
效果圖
這樣便能實(shí)現(xiàn)上圖中效果草冈。android:divider="@drawable"中的drawable也可以是圖片文件她奥,
修改android:divider="@drawable/shape_divider"為android:divider="@drawable/pic" ,
pic是一張圖片怎棱。效果如下圖
showDividers 一共有下面幾個(gè)參數(shù)值可選 middle|end|beginning|none
middle -- 在每一項(xiàng)中間添加分割線
end -- 在整體的最后一項(xiàng)添加分割線
beginning -- 在整體的最上方添加分割線
none -- 無(wú)
五哩俭、Space占位
Space控件在布局中只占位置,而不去繪制渲染蹄殃。
組件中的間隙用Space控件填充比用其它控件
填充可以提高繪制效率携茂。
<android.support.v4.widget.Space
android:layout_width="match_parent"
android:layout_height="20dp"/>
占位20dp高