移動開發 布局優化利器和ViewStub

2021-06-25 10:22:48 字數 1940 閱讀 4052

本文翻譯自《50 android hacks》

當建立複雜的布局的時候,有時候會發現新增了很多的viewgroup和view。隨之而來的問題是view樹的層次越來越深,應用也變的越來越慢,因為ui渲染是非常耗時的。

這時候就應該進行布局優化了。這裡介紹兩種方式,分別為標籤和viewstub類。

物件導向程式設計的其中乙個思想就是**的復用,那麼怎麼進行布局的復用呢?這時,就起作用了。

如果學過c語言,那麼對#include應該不陌生,它是乙個預編譯指令,在程式編譯成二進位制檔案之前,會把#include的內容拷貝到#include的位置。

android中的也可以這麼理解,就是把某些通用的xml**拷貝到所在的地方。以乙個activity為例。

footer_with_layout_properties.xml中就是乙個簡單的textview,**如下:

上述的**中,我們使用了標籤,達到了**復用的目的。

但是,仍然存在一些疑惑。

footer_with_layout_properties.xml中使用了android:layout_alignparentbottom屬性,這個屬性之所以可行,是因為外層布局是relativelayout。

那麼,如果外層布局換做linearlayout又會怎樣呢?答案顯而易見,這肯定是行不通的。那麼怎麼辦呢?我們可以把具體的屬性寫在標籤裡面,看下面的**。

我們直接在標籤裡面使用了android:layout_*屬性。

注意:如果想要在標籤中覆蓋被包含布局所指定的任何android:layout_*屬性,必須在標籤中同時指定layout_width和layout_height屬性,這可能是乙個android系統的乙個bug吧。

viewstub

在開發過程中,難免會遇到各種互動問題,例如顯示或隱藏某個檢視。如果想要乙個檢視只在需要的時候顯示,可以嘗試使用viewstub這個類。

先看一下viewstub的官方介紹:

「viewstub是乙個不可視並且大小為0的檢視,可以延遲到執行時填充布局資源。當viewstub設定為visible或呼叫inflate()之後,就會填充布局資源,viewstub便會被填充的檢視替代」。

現在已經清楚viewstub能幹什麼了,那麼看乙個例子。乙個布局中,存在乙個mapview,只有需要它的時候,才讓它顯示出來。

map.xml檔案中包含乙個mapview,只有在必要的時候,才會讓它顯示出來。

另外,inflatedid是viewstub被設定成visible或呼叫inflate()方法後返回的id,這個id就是被填充的view的id。在這個例子中,就是mapview的id。

接下來看看viewstub是怎麼使用的。

public class mainactivity extends mapactivity 

public void onshowmap(view v)

@override

protected boolean isroutedisplayed()

}

題外話

有的同學肯定會問,使用viewstub和單純地把view設定為view.gone或view.visible有什麼區別呢?不都是顯示和隱藏嗎,使用viewstub反而更麻煩了。

確實是有區別的,會涉及到view樹的渲染,記憶體消耗等。

至於有什麼具體的差別,就請大家自己去google吧。俗話說,自己動手,豐衣足食嘛!

參考資料

移動web開發布局

流式布局,就是百分比布局,也稱非固定畫素布局。通過盒子的寬度設定成百分比來根據螢幕的寬度來進行伸縮,不受固定畫素的限制,內容向兩側填充。流式布局方式是移動web開發使用的比較常見的布局方式。設定子項在側軸上的排列方式 並且只能用於子項出現 換行 的情況 多行 在單行下是沒有效果的。flex 屬性定義...

移動開發布局 flex

flex flow 3.flex布局子項常見屬性 當我們為父盒子設為flex布局以後,子元素的float clear和vertical align都會失效 伸縮布局 彈性布局 伸縮盒布局 彈性盒布局 flex布局 總結 就是通過給父盒子新增flex屬性,來控制子盒子的位置和排列方式 flex dir...

開發移動端頁面和響應式布局

開發移動端頁面和響應式布局 響應式布局 響應式布局是ethan marcotte在2010年5月份提出的乙個概念,簡而言之,就是乙個 能夠相容 多個終端,而不是為每個終端做乙個特定的版本。這個概念是為解決移動網際網路瀏覽而誕生的。由於響應式布局要針對不同的視口尺寸,對樣式作出更多的修改,因此並不像流...