相信大家經常聽到include、merge、ViewStub這樣的標籤,官方也提到這三種佈局可用於佈局的優化。今天就介紹下這三種佈局的使用,記錄下來,便於後續app中的使用。
include佈局重用
app開發過程中,會遇到不同頁面裏有相同的佈局,這時我們可以將這些通用的佈局提取出來到一個單獨的layout文件裏,再使用<include>標籤引入到相應的頁面佈局文件裏,主要通過include的layout屬性引用。
舉個例子,include的佈局:
activity佈局:
這個標籤在日常工作使用還是很常見的。這裏有幾點需要注意下:
1、如果給include標籤 和 include所加載的佈局 都添加id的話,那麼id要保持一致,如例子中都是container,否則是在代碼中獲取不到RelativeLayout容器的。 當然我們可以避免這樣的問題,只需要給其中一項添加id屬性就可以。
2、include佈局裏元素的id 要和 include所在頁面佈局裏的其他元素id 不同,如例子中的兩個textview,如果把id設置相同了,程序運行起來並不會報錯,但是textview的賦值只會賦值給其中的一個。
3、如果需要給include標籤設置位置屬性的話,如例子中的layout_below、layout_marginTop,這時候 必須 同時設置include標籤的寬高屬性layout_width、layout_height,否則編譯器是會報錯的。一般情況不需要設置include的其他屬性,直接加載佈局文件 <include layout="@layout/...."/>
4、佈局中可以包含兩個相同的include標籤
merge減少視圖層級
merge標籤可用於減少視圖層級來優化佈局,可以配合include使用,如果include標籤的父佈局 和 include佈局的根容器是相同類型的,那麼根容器的可以使用merge代替。
先看沒有使用merge的:
view層的結構:
再看使用了merge的:
view層結構:
可以看到對比,減少了一層的LinearLayout的嵌套,需要注意的是使用merge的佈局,在include的標籤設置距離屬性沒有生效,可以將一些間距屬性設置到include佈局裏元素上,具體看項目需求使用。
ViewStub按需加載
按需加載 顧名思義需要的時候再去加載,不需要的時候可以不用加載,節約內存使用。通常情況我們會使用setVisibility方法來控制視圖的顯示和隱藏,但是這種情況視圖已經加載了。
比如app中頁面裏某個佈局只需要在特定的情況下才顯示,其餘情況下可以不用加載顯示,這時候可以使用ViewStub。
layout屬性是需要加載佈局:
需要注意的是 ViewStub的inflate()方法只能被調用一次,一旦調用後,ViewStub將從視圖中移除,被對應的layout佈局取代,同時會保留ViewStub上設置的屬性效果。
好了,今天是一點小小的技巧分享,可以立即在項目中使用,文中有錯誤請大家無私的指出,你的支持是我前進的動力,掃描下方二維碼關注我吧。