Android布局優(yōu)化:include 睹逃、merge盗扇、ViewStub的詳細(xì)總結(jié)

一、include的用法以及注意點

官網(wǎng)文檔:通過 <include> 重復(fù)使用布局

include標(biāo)簽是用來解決布局復(fù)用的沉填。在開發(fā)Android布局時疗隶,我們常將一些通用的視圖提取到一個單獨的layout文件中,然后使用標(biāo)簽在需要使用的其他layout布局文件中加載進來翼闹。這樣斑鼻,便于對相同視圖內(nèi)容進行統(tǒng)一的控制管理,提高布局重用性猎荠。

下面我們以頭部導(dǎo)航欄為例坚弱,抽取布局如下:

title.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
     <Button  
        android:id="@+id/back"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_alignParentLeft="true"  
        android:layout_centerVertical="true"  
        android:text="返回" />  
  
    <TextView  
        android:id="@+id/title"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_centerInParent="true"  
        android:text="提示文字"  
        android:textSize="20sp" />  
 
</RelativeLayout>

使用也比較簡單蜀备,如下:

<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" >

    <include
        android:layout_width="match_parent"
        android:layout_height="40dp"
        layout="@layout/title" />

</RelativeLayout>

include標(biāo)簽使用注意點:

1.標(biāo)簽當(dāng)中,可以重寫所有l(wèi)ayout屬性的荒叶,如上面include中指定的layout屬性將會覆蓋掉title中指定的layout屬性琼掠。 而非layout屬性則無法在標(biāo)簽當(dāng)中進行覆寫。另外需要注意的是停撞,如果我們想要在標(biāo)簽當(dāng)中覆寫layout屬性瓷蛙, 必須要將layout_width和layout_height這兩個屬性也進行覆寫,否則覆寫效果將不會生效戈毒。
2.一個xml布局文件有多個include標(biāo)簽需要設(shè)置ID,才能找到相應(yīng)子View的控件,否則只能找到第一個include的layout布局,以及該布局的控件艰猬。
3.如果我們給include所加載的layout布局的根容器設(shè)置了id屬性,也在include標(biāo)簽中設(shè)置了id屬性埋市,同時需要在代碼中獲取根容器的控件對象時冠桃,最好將這兩個id設(shè)置相同的名稱!否則道宅,可能獲取不到根容器對象食听,即為null。

二污茵、merge的用法以及注意點

在一個布局中添加另一個布局時樱报,<merge> 標(biāo)記有助于消除視圖層次結(jié)構(gòu)中的冗余視圖組。<merge> 的一個用例是泞当,通過擴展 ViewGroup 實現(xiàn)自定義視圖迹蛤。

例如,如果您的主布局是一個垂直 LinearLayout襟士,其中兩個連續(xù)視圖可以在多個布局中重復(fù)使用盗飒,那么放置這兩個視圖的可重復(fù)使用布局需要有自己的根視圖。不過陋桂,如果使用另一個 LinearLayout 作為可重復(fù)使用的布局的根視圖逆趣,則會導(dǎo)致垂直 LinearLayout 內(nèi)出現(xiàn)垂直 LinearLayout。嵌套的 LinearLayout 沒有實際用處嗜历,而且會降低界面性能宣渗。

相反,您可以擴展 LinearLayout 以創(chuàng)建自定義視圖秸脱,并使用布局 XML 來描述其子視圖落包。XML 中的頂部標(biāo)記是 <merge>部蛇,而不是 LinearLayout摊唇,如以下示例所示:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/add"/>

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/delete"/>

</merge>

merge標(biāo)簽使用注意點:

1.根布局是FrameLayout且不需要設(shè)置background或padding等屬性,可以用merge代替,因為Activity的ContentView父元素就是FrameLayout,所以可以用merge消除只剩一個.
2.因為merge標(biāo)簽并不是View,所以在通過LayoutInflate.inflate()方法渲染的時候,第二個參數(shù)必須指定一個父容器,且第三個參數(shù)必須為true,也就是必須為merge下的視圖指定一個父親節(jié)點.由于merge不是View所以****對merge標(biāo)簽設(shè)置的所有屬性都是無效的.
3.merge標(biāo)簽必須使用在根布局,并且ViewStub標(biāo)簽中的layout布局不能使用merge標(biāo)簽.

三涯鲁、ViewStub的用法以及注意點

官網(wǎng)文檔:按需加載視圖

有時巷查,您的布局需要很少使用的復(fù)雜視圖有序。無論是作品詳情、進度指示器還是撤消消息岛请,您都可以通過僅在需要時加載這些視圖來減少內(nèi)存使用量并加快渲染速度旭寿。

如果您有應(yīng)用將來需要的復(fù)雜視圖,可以通過為復(fù)雜且很少使用的視圖定義 [ViewStub] 來延遲加載資源崇败。

假設(shè)您有一個布局盅称,希望在應(yīng)用的用戶體驗歷程的后續(xù)階段加載:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/iv"
        android:src="@drawable/logo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

您可以使用以下 ViewStub 推遲加載。如需讓它顯示或加載任何內(nèi)容后室,您必須使其顯示引用的布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/heavy_layout_we_want_to_postpone"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />
</FrameLayout>

activity中代碼如下:

public void show(View view){
        //
        ViewStub stub = ((ViewStub) findViewById(R.id.stub_import));
        if(stub!=null){
            View stubView = stub.inflate();
            ImageView address = (ImageView ) stubView.findViewById(R.id.iv);  
        }
    }

ViewStub標(biāo)簽使用注意點:

  • ViewStub標(biāo)簽不支持merge標(biāo)簽缩膝。因此這有可能導(dǎo)致加載出來的布局存在著多余的嵌套結(jié)構(gòu),具體如何去取舍就要根據(jù)各自的實際情況來決定了岸霹。
  • ViewStub的inflate只能被調(diào)用一次,第二次調(diào)用會拋出異常疾层。
  • 雖然ViewStub是不占用任何空間的,但是每個布局都必須要指定layout_width和layout_height屬性贡避,否則運行就會報錯痛黎。

總結(jié)

1.使用include標(biāo)簽重用布局
2.使用merge標(biāo)簽避免冗余的布局嵌套
3.使用ViewStub實現(xiàn)按需加載

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市刮吧,隨后出現(xiàn)的幾起案子湖饱,更是在濱河造成了極大的恐慌,老刑警劉巖杀捻,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琉历,死亡現(xiàn)場離奇詭異,居然都是意外死亡水醋,警方通過查閱死者的電腦和手機旗笔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拄踪,“玉大人蝇恶,你說我怎么就攤上這事』掏” “怎么了撮弧?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姚糊。 經(jīng)常有香客問我贿衍,道長,這世上最難降的妖魔是什么救恨? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任贸辈,我火速辦了婚禮,結(jié)果婚禮上肠槽,老公的妹妹穿的比我還像新娘擎淤。我一直安慰自己奢啥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布嘴拢。 她就那樣靜靜地躺著桩盲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪席吴。 梳的紋絲不亂的頭發(fā)上赌结,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音孝冒,去河邊找鬼姑曙。 笑死,一個胖子當(dāng)著我的面吹牛迈倍,可吹牛的內(nèi)容都是我干的伤靠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼啼染,長吁一口氣:“原來是場噩夢啊……” “哼宴合!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迹鹅,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卦洽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斜棚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阀蒂,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年弟蚀,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚤霞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡义钉,死狀恐怖昧绣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捶闸,我是刑警寧澤夜畴,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站删壮,受9級特大地震影響贪绘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜央碟,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一税灌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦垄琐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坯认,卻和暖如春翻擒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牛哺。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工陋气, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人引润。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓巩趁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淳附。 傳聞我的和親對象是個殘疾皇子议慰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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