Android性能之布局優(yōu)化

優(yōu)化布局層次

Google建議View 的高度不應(yīng)超過(guò)10層曼库,避免嵌套過(guò)多。

盡量減少布局層級(jí)和復(fù)雜度
  1. 盡量不要嵌套使用RelativeLayout.
  2. 盡量不要在嵌套的LinearLayout中都使用weight屬性.
  3. Layout的選擇, 以盡量減少View樹(shù)的層級(jí)為主.
  4. 去除不必要的父布局.
  5. 善用TextView的Drawable減少布局層級(jí)
  6. 如果H Viewer查看層級(jí)超過(guò)5層, 你就需要考慮優(yōu)化下布局了~
善用Tag
<include>

<include>標(biāo)簽可以允許在一個(gè)布局當(dāng)中引入另外一個(gè)布局略板,那么比如說(shuō)我們程序的所有界面都有一個(gè)公共的部分,這個(gè)時(shí)候最好的做法就是將這個(gè)公共的部分提取到一個(gè)獨(dú)立的布局文件當(dāng)中慈缔,然后在每個(gè)界面的布局文件當(dāng)中來(lái)引用這個(gè)公共的布局叮称。

在<include>標(biāo)簽當(dāng)中,我們是可以覆寫(xiě)所有l(wèi)ayout屬性的藐鹤,即include中指定的layout屬性將會(huì)覆蓋掉原布局中指定的layout屬性瓤檐。

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical" >  
  
    <include  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        layout="@layout/titlebar" />  
  
    ......  
  
</LinearLayout>
<merge>

<merge>標(biāo)簽是作為<include>標(biāo)簽的一種輔助擴(kuò)展來(lái)使用的,它的主要作用是為了防止在引用布局文件時(shí)產(chǎn)生多余的布局嵌套娱节。大家都知道挠蛉,Android去解析和展示一個(gè)布局是需要消耗時(shí)間的,布局嵌套的越多肄满,那么解析起來(lái)就越耗時(shí)谴古,性能也就越差,因此我們?cè)诰帉?xiě)布局文件時(shí)應(yīng)該讓嵌套的層數(shù)越少越好稠歉。

一般<merge>會(huì)和<include>標(biāo)簽 配合使用掰担。

<ViewStub>

有的時(shí)候我們會(huì)遇到這樣的場(chǎng)景,就是某個(gè)布局當(dāng)中的元素非常多怒炸,但并不是所有元素都一起顯示出來(lái)的带饱,而是普通情況下只顯示部分常用的元素,而那些不常用的元素只有在用戶進(jìn)行特定操作的情況下才會(huì)顯示出來(lái)。

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical" >  
  
    <EditText  
        android:id="@+id/edit"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:layout_marginBottom="10dp"  
        android:layout_marginLeft="20dp"  
        android:layout_marginRight="20dp"  
        android:layout_marginTop="10dp"  
        android:hint="@string/edit_something_here" />  
  
    <Button  
        android:id="@+id/more"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_gravity="right"  
        android:layout_marginRight="20dp"  
        android:layout_marginBottom="10dp"  
        android:text="More" />  
      
    <ViewStub   
        android:id="@+id/view_stub"  
        android:layout="@layout/profile_extra"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        />  
  
    <include layout="@layout/ok_cancel_layout" />  
  
</LinearLayout>  

可以看到勺疼,這里我們新增了一個(gè)More Button教寂,這個(gè)按鈕就是用于去加載那些不常用的元素的,然后在Button的下面定義了一個(gè)ViewStub执庐。在ViewStub控件中酪耕,我們先是通過(guò)id屬性給它指定了一個(gè)唯一標(biāo)識(shí),又通過(guò)layout屬性將profile_extra布局傳入進(jìn)來(lái)耕肩,接著給ViewStub指定了一個(gè)寬高因妇。注意,雖然ViewStub是不占用任何空間的猿诸,但是每個(gè)布局都必須要指定layout_width和layout_height屬性婚被,否則運(yùn)行就會(huì)報(bào)錯(cuò)。

接著修改ProfileActivity中的代碼梳虽,在Activity中添加More Button的點(diǎn)擊事件址芯,并在點(diǎn)擊事件中進(jìn)行如下邏輯處理:

private EditText editExtra1;  
private EditText editExtra2;  
private EditText editExtra3;  
  
public void onMoreClick() {  
    ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);  
    if (viewStub != null) {  
        View inflatedView = viewStub.inflate();  
        editExtra1 = (EditText) inflatedView.findViewById(R.id.edit_extra1);  
        editExtra2 = (EditText) inflatedView.findViewById(R.id.edit_extra2);  
        editExtra3 = (EditText) inflatedView.findViewById(R.id.edit_extra3);  
    }  
} 

當(dāng)點(diǎn)擊More Button之后我們首先會(huì)調(diào)用findViewById()方法將ViewStub的實(shí)例獲取到,拿到ViewStub的實(shí)例之后就很簡(jiǎn)單了窜觉,調(diào)用inflate()方法或者setVisibility(View.VISIBLE)都可以將隱藏的布局給加載出來(lái)谷炸,而加載的這個(gè)布局就是剛才在XML當(dāng)中配置的profile_extra布局。

調(diào)用inflate()方法之后會(huì)將加載出來(lái)的布局進(jìn)行返回禀挫,之后我們就可以對(duì)這個(gè)布局進(jìn)行任意的操作了旬陡,再次隱藏顯示,或者獲取子元素的實(shí)例等语婴。注意這里我對(duì)ViewStub的實(shí)例進(jìn)行了一個(gè)非空判斷描孟,這是因?yàn)閂iewStub在XML中定義的id只在一開(kāi)始有效,一旦ViewStub中指定的布局加載之后砰左,這個(gè)id也就失敗了匿醒,那么此時(shí)findViewById()得到的值也會(huì)是空。

另外需要提醒大家一點(diǎn)缠导,ViewStub所加載的布局是不可以使用<merge>標(biāo)簽的廉羔,因此這有可能導(dǎo)致加載出來(lái)的布局存在著多余的嵌套結(jié)構(gòu),具體如何去取舍就要根據(jù)各自的實(shí)際情況來(lái)決定了僻造,對(duì)于那些隱藏的布局文件結(jié)構(gòu)相當(dāng)復(fù)雜的情況憋他,使用ViewStub還是一種相當(dāng)不錯(cuò)的選擇的,即使增加了一層無(wú)用的布局結(jié)構(gòu)髓削,仍然還是利大于弊举瑰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蔬螟,隨后出現(xiàn)的幾起案子此迅,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耸序,死亡現(xiàn)場(chǎng)離奇詭異忍些,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)坎怪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門罢坝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搅窿,你說(shuō)我怎么就攤上這事嘁酿。” “怎么了男应?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵闹司,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我沐飘,道長(zhǎng)游桩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任耐朴,我火速辦了婚禮借卧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筛峭。我一直安慰自己铐刘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布影晓。 她就那樣靜靜地躺著滨达,像睡著了一般渣慕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钢拧,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天锯七,我揣著相機(jī)與錄音,去河邊找鬼抖格。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啦辐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜈项,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芹关!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起紧卒,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侥衬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體轴总,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡直颅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怀樟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片功偿。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖往堡,靈堂內(nèi)的尸體忽然破棺而出械荷,到底是詐尸還是另有隱情,我是刑警寧澤虑灰,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布吨瞎,位于F島的核電站,受9級(jí)特大地震影響瘩缆,放射性物質(zhì)發(fā)生泄漏关拒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一庸娱、第九天 我趴在偏房一處隱蔽的房頂上張望着绊。 院中可真熱鬧,春花似錦熟尉、人聲如沸归露。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剧包。三九已至,卻和暖如春往果,著一層夾襖步出監(jiān)牢的瞬間疆液,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工陕贮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堕油,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓肮之,卻偏偏與公主長(zhǎng)得像掉缺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戈擒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容