如果你曾經這樣寫過像下面這一行的程式,那可能就會導致一些排版上的問題:
inflater.inflate(R.layout.my_layout, null);
關於 LayoutInflater
先來看一下 LayoutInflater 中的這兩個函式:
inflate(int resource, ViewGroup root)
inflate(int resource, ViewGroup root, boolean attachToRoot)
第一個參數是 XML layout id,另外2個參數就有點微妙了。
ViewGroup root : 通常是指 Parent View
boolean attachToRoot : 要不要把 inflate 後的 view 黏上 root (Parent View)
你若把 parent view 設成 null,還是可以成功的取得 inflate 後的 view,好像也是用得很開心。但是當你設 parent view 為 null 時,其實是對 Framework 說:「金歹勢,我不知道我的 Parent View 是誰,請忘了他吧。」
這會造成一個問題:
因為沒有 root (parent view) 的存在,所以原先在 parent view 所宣告的一些 LayoutParams 就無法套用到新的 inflated children view 上。看看下面的例子:
然後在使用 ListView 時去取得我們的 custom view (item_row):
但是因為 Parent View 被設為 null,所以無法使用 ListView 預設的每列高度,會出現下圖的結果:「預設的每列高度消失了,每個 row 看起來變的非常窄。」(如下圖)
若是在 Inflate XML layout 時,設定了正確的 Parent View:
就會如下圖所示的採用預設好的每列高度,看起來舒服、美觀多了:
有規則就有例外
這個規則的例外,就是當你想客製化一個 AlertDialog 時:
因為在 AlertDialog.Builder 的情況下,你要客製化的 Custom View 就是透過 setView 成為了該 AlertDialog 的 Root View,所以這時所 inflate 出來的 view 就不需指定 Parent View 了。
沒有留言 :
張貼留言