1. 程式人生 > >Android面試中的一個常見問題:Layout_weight的用法

Android面試中的一個常見問題:Layout_weight的用法

這個屬性可能對於初學者來說比較頭疼,也是一道比較經典的Android面試題,這不,最近在公司面了好幾個來面試Android工作的人,發現好幾個面試者做的卷子裡有道關於layout_weight的問題,感覺答得不是很好,遂想寫個部落格(其實是想要記錄下這有意思的事,好久沒寫部落格了,看完記得點贊哦),總結了以下幾個小點,幫助大家理解哈。

一、如果把每個layout_width設為0dp,layout_weight設為1,會出現什麼問題呢?
首先我先在XML中寫個佈局檔案,程式碼如下:
程式碼片段1

執行效果如下:
程式碼片段2

那麼問題來了:雖然layout_weight是有效果了,但是為什麼三個TextView沒有對齊呢?
問題解析:其實三個控制元件間是對齊了的,只是以當中的內容對齊。這當中的問題是在父容器中存在一個android:baselineAligned = “true”,所以我們應當把它設為false。
修改程式碼如下:
程式碼片段3


最終效果如下:
程式碼片段4

二、如果把第一個layout_width設為wrap_content,又設定了每個控制元件的layout_weight的權值,那麼佈局會如何分配寬度呢?
程式碼如下:
程式碼片段5

執行的效果如下:
程式碼片段6

layout_weight分配的演算法是:LinearLayout中的layout_weight屬性,首先按照控制元件宣告的尺寸進行分配,然後再將剩下的尺寸按weight分配

三、如果把每個layout_width設為match_parent之後,也配置了layout_weight,那麼又是如何分配寬度的?
程式碼如下:
程式碼片段7

執行效果如下:
程式碼片段8

那麼問題又來了:發現第一個TextView反而比其他兩個權值更大的控制元件寬度更大呢?

分析:根據上面總結的分配規則,首先減去控制元件宣告的尺寸,父控制元件剩餘的尺寸按比例分配。假設螢幕的寬度是720,那麼很明顯三個控制元件的寬度都是match_parent是不夠分的,此時分配完控制元件宣告的尺寸後,父控制元件剩餘的寬度就為負數了,父控制元件剩餘寬度rest = 720 - 720 * 3 = -720 * 2,接著就把剩餘的寬度按layout_weight宣告的比例分配。下面就來具體計算各個控制元件的寬度:
(1)那麼就來計算第一個控制元件實際所分配的控制元件寬度:layout_width + 父控制元件剩餘的寬度比例 –> 720 + (-720*2)/5 = 720 * (3/5)
(2)TextView2和TextView3的權值都是2,實際所分配的寬度大小就是:720 + (-720 * 2)/(2/5)= 720 * (1/5)

由此可見:上面所說的layout_weight寬度分配規則是正確的,控制元件寬度 + 父控制元件剩餘寬度 * weight比例。

下面我再說下可以和layout_weight結合的一個屬性layoutSum,實現一個很有意思功能。
場景:假設只有一個控制元件,但是又想按比例分配寬度,怎麼解決?
程式碼片段9

問題分析:此時就缺少其他控制元件進行比例的劃分;
解決方案:雖然只有一個控制元件,但可以在父佈局中定義總的權值,這樣子控制元件就可以有權值的比例了。
實現程式碼如下:
程式碼片段10

四、不知道大家有沒發現XML中有些屬性是以layout開頭,像layout_gravity什麼的,而有些屬性則沒有layout開頭,這有什麼不同呢?
問題分析:layout的意思是佈局,layout開頭的屬性實際上是說這些屬性由其父容器去獲取,再去設定。而沒有以layout開頭的屬性,就是由控制元件自己獲取設定。
總結一句話就是:Layout_開頭都是交給父容器,沒有Layout_開頭都是本身的屬性。