搜尋此網誌

2013-10-24

LayoutInflation 注意事項

簡單的說,Layout inflation 指的是把 XML layout resource 經過轉換後變成可以運用在程式的 View Hierachy 之中。

如果你曾經這樣寫過像下面這一行的程式,那可能就會導致一些排版上的問題:
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 了。

沒有留言 :

張貼留言