1. 程式人生 > >使用GridLayout佈局時小心子控制元件的layout_width埋坑,導致寬度溢位且設定無效

使用GridLayout佈局時小心子控制元件的layout_width埋坑,導致寬度溢位且設定無效

像設定頁面、新增編輯頁面,是比較適合用GridLayout和TableLayout佈局。今天用GridLayout時,怎麼都調整不了子控制元件的寬度。找了半天,原來是子控制元件的layout_width屬性設定導致。將屬性值由match_parent改成wrap_content,還要注意如果有多行,要將所有行該列的值都要修改。

問題研究過程如下。

1、使用GridLayout佈局,新增基本的控制元件,頁面的初始Design效果如下。採用2列的GridLayout佈局,現在想把右邊的姓名編輯框撐滿布局。第一個想到的,就是把編輯框的layout_width設定為匹配父視窗。


2、將姓名編輯框的layout_width值,由wrap_content改成match_parent,將下面一行的同一列電話編輯框寬度值也修改。現在設計模式的效果圖如下,乍一看好像是撐滿了。執行起來後,看一下效果,好像也沒問題,撐滿了右邊的佈局。不過好像太靠右了,最好是能和右邊界有個空隙。



3、於是調整右邊的padding。設定編輯框的paddingRight為16dp。但是執行之後沒有效果,仍然沒有間隙。怎麼回事?仔細檢視,介面好像有點不對。右邊的控制元件好像超過了介面寬度,溢位到外面去了。看下面的圖,選中的控制元件明顯感覺右邊被截掉了一部分。而且截斷的寬度差不多正好是第一列文字框的寬度。

執行起來後測試,發現確實存在被截斷。一直輸入直到超過邊界,游標會一直往後移。當超過邊界後,還可以輸入,但是游標已經看不見了。在正常的控制元件中,只要是有輸入,焦點的游標是可見的。見後面的對比圖二。

正常輸入的,都可以看見游標。


所以這個撐爆了,是怎麼回事呢?

久經波折和測試,找到答案。原來是我們第2列的編輯框的寬度,不能設定為match_parent。如果設定為匹配父視窗,那麼它的寬度就是父視窗。所以它不僅撐滿了右邊的佈局,而且還撐爆了,多出來的寬度正好是第一列的寬度。

如何修改?將第2列的編輯框寬度layout_width改回來,由match_parent改成wrap_content。寬度由內容決定。然後把layout_gravity屬性值設定為fill或者fill_horizontal。這樣子控制元件就會撐滿剩餘空間。

效果如下圖所示。在設計檢視中就正常了,右邊的選中編輯(藍色的選中線)線都可以看見。執行起來的效果,也沒有超標了。



這樣一個坑,也是醉了。要有3個地方注意:

  1. 不仔細看,沒發現右邊的被撐爆了。
  2. 不把控制元件的layout_width由match_parent改成wrap_content,即使是設定了layout_gravity屬性,也沒用。或者是設定layout_columnWeight,也沒用。
  3. 只修改某一行的layout_width還不行,還必須將所有行的該列的layou_width值都修改。否則寬度還是由最寬的列決定。