布局優(yōu)化技巧

布局技巧

在Android開發(fā)過程中蔗蹋,我們會遇到很多的問題,隨著UI界面越來越多毯盈,布局的重復(fù)性、復(fù)雜度也隨之增加病袄,所幸的是搂赋,Android官方也給出了幾個對布局進(jìn)行優(yōu)化的方法,下面根據(jù)自己的理解對官方所介紹的方法進(jìn)行分享陪拘,有錯誤的地方希望大家進(jìn)行留言厂镇,相互交流。

輕量布局之ViewStub標(biāo)簽分析

ViewStub是一個輕量級View左刽,也是一個初始化不做任何事情的View,但是之后我們可以加載入一個布局文件酌媒,在慢加載時View中做占位符而已欠痴。比如我們根據(jù)條件在動態(tài)加載View或者某個布局時,最通常就是把可能用到的View都寫在布局上秒咨,然后可見性都設(shè)置為View.GONE 喇辽。之后在代碼中動態(tài)更改其可見性,雖然操作簡單雨席,但是耗費(fèi)資源菩咨,因?yàn)閂iew.GONE在inflate布局仍會inflate,仍會創(chuàng)建對象,會被實(shí)例化抽米,會被設(shè)置屬性特占。而我推薦做法是用android.view.ViewStub,它指定一個布局時會被inflate和實(shí)例化云茸,但是不占布局位置是目,占用資源少。當(dāng)ViewStub所指向的布局被設(shè)置為可見标捺,或者是調(diào)用了ViewStub.inflate()時懊纳,ViewStub所在的布局才會進(jìn)行inflate之后實(shí)例化,然后ViewStub的布局屬性傳給它所指定的布局亡容。當(dāng)然嗤疯,ViewStub的使用還是有缺點(diǎn)的,并不是任何時候都可以用闺兢。

ViewStub使用限制:

  1. ViewStub只能被inflate一次身弊,之后ViewStub對象就會被置為空,就從view層次上移除了列敲,也就是說它所指定的布局被inflate之后阱佛,就不能再通過ViewStub去控制這個布局了;
  2. ViewStub只能用來inflate一個布局文件戴而,而不能是某一個具體的View凑术,這時我們要做的是可以將View寫在一個布局中;
  3. ViewStub目前還不支持<merge/>標(biāo)簽所意。

考慮到以上ViewStub的特點(diǎn)淮逊,再結(jié)合我自身的開發(fā)過程中,可以考慮到使用的ViewStub時主要有以下的情形:

  • 當(dāng)需要在運(yùn)行時不止一次的顯示和隱藏某一個布局時扶踊,ViewStub不可用泄鹏,因?yàn)樗荒軌騣nflate一次,之后就會被置為空秧耗。這時只能采用View的可見性來控制了备籽。
  • 想要控制的是一個布局文件,而非View分井,ViewStub指定的是一個布局id车猬,而非一個View對象。

當(dāng)在使用ViewStub的布局屬性時尺锚,某些屬性是加在ViewStub上面珠闰,而不是加在實(shí)際的布局上面,這樣才會起作用瘫辩。而ViewStub的屬性在inflate之后會都傳給相應(yīng)的布局伏嗜。其中有個屬性android:inflatedId 指是的可以使用它來重寫包含布局文件的根元素的id坛悉。而在ViewStub上設(shè)定的layout_* 參數(shù)將會應(yīng)用到包含的布局文件的頂部。

重用布局之Include標(biāo)簽分析

我們在做項(xiàng)目過程中承绸,用得最多的標(biāo)簽應(yīng)該是include裸影,它是為了解決重復(fù)定義相同布局的問題。例如你有五個界面八酒,這五個界面頂部都有一個相同的一個返回按妞和一個文本控件空民,若在不使用include情況下你在每個界面都需要重新在xml里面寫相同的布局,這樣造成工作量重復(fù)羞迷。而當(dāng)我們使用了include標(biāo)簽界轩,就可以把多次使用的這個布局獨(dú)立成一個xml文件,之后在需要的地方通過include標(biāo)簽進(jìn)行引用衔瓮,自己不用再重復(fù)寫一遍浊猾。示例如下:
my_title_layout.xml

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:id="@+id/my_title_parent_id"  
    android:layout_height="wrap_content" >  

    <ImageButton  
        android:id="@+id/back_btn"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:src="@drawable/ic_launcher" />  

    <TextView  
        android:id="@+id/title_tv"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerVertical="true"  
        android:layout_marginLeft="20dp"  
        android:layout_toRightOf="@+id/back_btn"  
        android:gravity="center"  
        android:text="我的title"  
        android:textSize="18sp" />  
</RelativeLayout>  

而在include布局文件中進(jìn)行設(shè)置:

<?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:id="@+id/my_title_ly"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        layout="@layout/my_title_layout" />  

    <!-- 代碼省略 -->
</LinearLayout>     

注意事項(xiàng)

  • 使用include最常見是找不到findViewById查找不到目標(biāo)控件,應(yīng)通過include的id來獲取目標(biāo)布 局中子控件,當(dāng)include指定了id热鞍,而你的layout也指定了id葫慎,則你的layout中的id會被覆蓋。這里來說薇宠,具體使用的id應(yīng)該是my_title_ly,而不應(yīng)該是原先的my_title_parent_id
  • 其次偷办,在include標(biāo)簽中所有的android:layout_*都是有效的,但前提是必須要寫layout_width和layout_height兩個屬性
  • 布局中可以包含兩個相同的include標(biāo)簽澄港,引用時可以使用不同的include的id進(jìn)行查找即可

減少布局層級之merge標(biāo)簽分析

merge標(biāo)簽可以刪除多余的層級椒涯,優(yōu)化UI。其多用于替換FrameLayout或者當(dāng)一個布局包含另一個時回梧,它主要消除視圖層次結(jié)構(gòu)中多余的視圖組废岂。主要使用在當(dāng)一個子視圖不需要指定任何針對父視圖的布局屬性時,例如你的主布局文件是垂直布局狱意,引入了一個垂直布局的include并且引入的布局沒有針對父視圖屬性時湖苞,這時如果include布局使用的LinearLayout就會沒有意義,使用的話會重復(fù)有兩個LinearLayout布局详囤,這樣的話會增多無必要的UI層次的布局财骨,這時就可以用<merge>標(biāo)簽進(jìn)行優(yōu)化成一個LinearLayout

注意事項(xiàng)

  • 其標(biāo)簽只可用作xml中l(wèi)ayout布局文件的根節(jié)點(diǎn),如果擴(kuò)充的layout布局本身是由merge作為根節(jié)點(diǎn)的話纬纪,則在代碼中需要將被導(dǎo)入的layout布局文件置于ViewGroup中蚓再,同時需要設(shè)置attachToRoot為True

總結(jié)

布局優(yōu)化的分享到此就結(jié)束了,在Android開發(fā)的過程中包各,只要我們多使用這些布局標(biāo)簽,會使得我們的布局看起來更加的專業(yè)靶庙。有問題的朋友可以留言一起探討问畅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子护姆,更是在濱河造成了極大的恐慌矾端,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵皂,死亡現(xiàn)場離奇詭異秩铆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)灯变,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門殴玛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人添祸,你說我怎么就攤上這事滚粟。” “怎么了刃泌?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵凡壤,是天一觀的道長。 經(jīng)常有香客問我耙替,道長亚侠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任俗扇,我火速辦了婚禮硝烂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狐援。我一直安慰自己钢坦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布啥酱。 她就那樣靜靜地躺著爹凹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镶殷。 梳的紋絲不亂的頭發(fā)上禾酱,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音绘趋,去河邊找鬼颤陶。 笑死,一個胖子當(dāng)著我的面吹牛陷遮,可吹牛的內(nèi)容都是我干的滓走。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼帽馋,長吁一口氣:“原來是場噩夢啊……” “哼搅方!你這毒婦竟也來了比吭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤姨涡,失蹤者是張志新(化名)和其女友劉穎衩藤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涛漂,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赏表,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匈仗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓢剿。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖锚沸,靈堂內(nèi)的尸體忽然破棺而出跋选,到底是詐尸還是另有隱情,我是刑警寧澤哗蜈,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布前标,位于F島的核電站,受9級特大地震影響距潘,放射性物質(zhì)發(fā)生泄漏炼列。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一音比、第九天 我趴在偏房一處隱蔽的房頂上張望俭尖。 院中可真熱鬧,春花似錦洞翩、人聲如沸稽犁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽已亥。三九已至,卻和暖如春来屠,著一層夾襖步出監(jiān)牢的瞬間虑椎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工俱笛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捆姜,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓迎膜,卻偏偏與公主長得像泥技,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子磕仅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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

  • 在前面幾篇文章當(dāng)中零抬,我們學(xué)習(xí)了如何通過合理管理內(nèi)存镊讼,以及高性能編碼技巧的方式來提升應(yīng)用程序的性能宽涌。然而實(shí)際上界面布...
    Ten_Minutes閱讀 1,221評論 1 8
  • 今天分享一些layout布局書寫中的一些技巧平夜,希望看過之后你也一樣可以寫出性價比高的布局。我個人的目標(biāo)是用最少的V...
    wo叫天然呆閱讀 1,242評論 0 9
  • 想過離開卸亮,又不清楚自己去哪里忽妒,只是心底有個聲音一直重復(fù)“你不屬于這里” 喜歡這段話,更主要的是它...
    一山道人25閱讀 245評論 0 0
  • 在今年九月份的第二個星期鸯檬,我們分手了。還差兩個星期我們就在一起半年了? 剛分手的時候你還會拼命的挽回螺垢,或許...
    魚呀閱讀 334評論 0 0
  • 今天做了人生中的第一次分享喧务,從效果來說,是失敗的枉圃。因?yàn)橹挥幸粋€配合者功茴,并且還是死黨,前期的配合者孽亲。失敗的原因有幾點(diǎn)...
    sanwei閱讀 248評論 0 0