其實只要是 ScrollView 或者 HorizontalScrollView 裡面塞 RelativeLayout 都會有這樣的問題..

最近把手邊的程式 targetSdkVersion 從 17 換到 19, 這才發現某些 layout 怪怪的. 我的 case 是這樣:

  • 在 ListView item 中使用 RelativeLayout 當 root view, layout height 設定為 wrap content
  • layout 中有一個 LinearLayout, 寬度固定高度為 match parent, 裡面包兩個 button, 透過 height="0dp" 與 weight="1" 均分高度
  • 因為 root view 為 wrap content, 所以該 LinearLayout 得對齊另一個固定高度 view 的上下緣方能填滿 root view

當 targetSdkVersion 為 17 時, 會是我想要的結果:

當 targetSdkVersion 為 19 時, button 擠在一起:

前者其實是因為 RelativeLayout 在計算 button 所需高度時, 因為 LinearLayout match parent/wrap content 的關係導致 overflow, 系統判定可以給予非常大的高度, 而又因為設定 weight 都是 1 的緣故, 造成按鈕均分的效果.

之後的版本在 View.javaRelativeLayout.java 多做了一些判斷 (找 sUseBrokenMakeMeasureSpec & mAllowBrokenMeasureSpecs) 所以如果 LinearLayout 或者 RelativeLayout 沒有指定高度, 呈現的結果一定會亂七八糟, 除非在 build 的時候指定 targetSdkVersion 為 17, 但這樣的犧牲有點大..

最後還是靠調整 layout files 解決這個狀況 :p

Ref: http://developer.android.com/reference/android/widget/RelativeLayout.html

Comments

comments powered by Disqus