
一、刪除無用控件和層級
布局優(yōu)化的思想很簡單,就是盡量減少布局文件的層級,布局層級少了,那么Android繪制時的工作量少了,程序性能自然就提高了;
二、有選擇的使用性能較低的ViewGroup
①如果布局中既可以使用LinearLayout又可以使用RelativeLayout,那就采用LinearLayout,這是因為RelativeLayout的功能比較復(fù)雜,它的布局過程需要花費更多的CPU時間。
②FrameLayout和LinearLayout一樣,都是一種簡單高效的ViewGroup,因此可以考慮使用它們。
③很多時候,單純的通過一個LinearLayout或者FrameLayout無法實現(xiàn)產(chǎn)品效果,需要通過嵌套的方式來完成,這種情況還是建議采用RelativeLayout,因為ViewGroup的嵌套就相當(dāng)于增加了布局的層級,同樣會降低程序的性能。
三、采用<include>標簽、<merge>標簽和ViewStub
下面分別介紹這些標簽的使用場景與好處:
1.<include>
①使用場景:一個布局在多個地方使用;
②好處:布局重用;
③注意事項:
a.這個標簽只支持以android:layout_開頭的屬性,其它屬性不支持,android:id是個特例,如果include指定了id,同時被包含的布局文件根元素也指定了id屬性,那么以include指定的id為準。
b.如果<include>標簽指定了android:layout_這種屬性,那么要求android:layout_height和android:layout_width必須存在,否則其他android:layout_的屬性無法生效。
2.<merge>
①使用場景:當(dāng)前布局是一個豎直方向的LinearLayout,這個時候如果被包含的布局文件中也采用了數(shù)值方向的LinearLayout,那么顯然被包含的布局文件中的LinearLayout是多余的,通過<merge>標簽就可以去掉多余的那一層,如下:
<merge xmls:android="http://schemas.android.com/apk/res/android">
<Button
...../>
<Button
...../>
</merge>
②好處:<merge>標簽一般和<include>配合使用,它可以降低減少布局的層級
3.ViewStub
①使用場景:在實際開發(fā)中,很多布局文件正常情況下不需要顯示,比如網(wǎng)絡(luò)異常時的界面,這個時候就沒必要在整個界面初始化的時候加載進來;
②好處:ViewStub繼承了View,它非常輕量級且寬/高都是0,因此它本身不參與任何的布局和繪制過程。ViewStub的意義在于按需加載所需的布局文件,在使用的時候再加載,提高程序初始化時的性能。
③使用方法:
<!--
stub_import是ViewStub的id
panel_import是layout/layout_network_err這個布局的根元素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中的布局時,可以按如下兩種方式進行:
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
或者
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
當(dāng)ViewStub通過setVisibility或者inflat方法加載后,ViewStub就會被它內(nèi)部的布局替換掉,這個時候ViewStub就不再是整個布局結(jié)構(gòu)中的一部分了。
④注意:目前ViewStub還不支持<merge>標簽。