一、刪除無(wú)用控件和層級(jí)
布局優(yōu)化的思想很簡(jiǎn)單絮缅,就是盡量減少布局文件的層級(jí),布局層級(jí)少了呼股,那么Android繪制時(shí)的工作量少了耕魄,程序性能自然就提高了;
二彭谁、有選擇的使用性能較低的ViewGroup
①如果布局中既可以使用LinearLayout又可以使用RelativeLayout吸奴,那就采用LinearLayout,這是因?yàn)镽elativeLayout的功能比較復(fù)雜缠局,它的布局過程需要花費(fèi)更多的CPU時(shí)間则奥。
②FrameLayout和LinearLayout一樣,都是一種簡(jiǎn)單高效的ViewGroup狭园,因此可以考慮使用它們读处。
③很多時(shí)候,單純的通過一個(gè)LinearLayout或者FrameLayout無(wú)法實(shí)現(xiàn)產(chǎn)品效果妙啃,需要通過嵌套的方式來完成档泽,這種情況還是建議采用RelativeLayout,因?yàn)閂iewGroup的嵌套就相當(dāng)于增加了布局的層級(jí)揖赴,同樣會(huì)降低程序的性能。
三抑胎、采用<include>標(biāo)簽燥滑、<merge>標(biāo)簽和ViewStub
下面分別介紹這些標(biāo)簽的使用場(chǎng)景與好處:
1.<include>
①使用場(chǎng)景:一個(gè)布局在多個(gè)地方使用;
②好處:布局重用;
③注意事項(xiàng):
a.這個(gè)標(biāo)簽只支持以android:layout_開頭的屬性阿逃,其它屬性不支持铭拧,android:id是個(gè)特例赃蛛,如果include指定了id,同時(shí)被包含的布局文件根元素也指定了id屬性搀菩,那么以include指定的id為準(zhǔn)呕臂。
b.如果<include>標(biāo)簽指定了android:layout_這種屬性,那么要求android:layout_height和android:layout_width必須存在肪跋,否則其他android:layout_的屬性無(wú)法生效歧蒋。
2.<merge>
①使用場(chǎng)景:當(dāng)前布局是一個(gè)豎直方向的LinearLayout,這個(gè)時(shí)候如果被包含的布局文件中也采用了數(shù)值方向的LinearLayout州既,那么顯然被包含的布局文件中的LinearLayout是多余的谜洽,通過<merge>標(biāo)簽就可以去掉多余的那一層,如下:
<merge xmls:android="http://schemas.android.com/apk/res/android">
<Button
...../>
<Button
...../>
</merge>
②好處:<merge>標(biāo)簽一般和<include>配合使用吴叶,它可以降低減少布局的層級(jí)
3.ViewStub
①使用場(chǎng)景:在實(shí)際開發(fā)中阐虚,很多布局文件正常情況下不需要顯示,比如網(wǎng)絡(luò)異常時(shí)的界面蚌卤,這個(gè)時(shí)候就沒必要在整個(gè)界面初始化的時(shí)候加載進(jìn)來实束;
②好處:ViewStub繼承了View,它非常輕量級(jí)且寬/高都是0逊彭,因此它本身不參與任何的布局和繪制過程磕洪。ViewStub的意義在于按需加載所需的布局文件,在使用的時(shí)候再加載诫龙,提高程序初始化時(shí)的性能析显。
③使用方法:
<!--
stub_import是ViewStub的id
panel_import是layout/layout_network_err這個(gè)布局的根元素id
-->
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/layout_network_err" />
如何做到按需加載呢?
在需要加載ViewStub中的布局時(shí)签赃,可以按如下兩種方式進(jìn)行:
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
或者
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
當(dāng)ViewStub通過setVisibility或者inflat方法加載后谷异,ViewStub就會(huì)被它內(nèi)部的布局替換掉,這個(gè)時(shí)候ViewStub就不再是整個(gè)布局結(jié)構(gòu)中的一部分了锦聊。
④注意:目前ViewStub還不支持<merge>標(biāo)簽歹嘹。