[Android] LayoutInflater的使用概念

Inflater是指打氣機的意思,比如把氣球充滿氣,所以layout inflater就是把layout充氣充滿的機制,可以想像成製作出一個layout的意思。
在Android裡面,layout(版面配置),是定義使用者所看到的介面的視覺上的結構,你可以在xml上定義好,或是在執行時才定義。
一般的Activity都是由onCreate時透過setContentView來指定內容view的xml檔案為何,但如果是動態的去產生已由xml定義好的view的話,就需要使用LayoutInflater,他取得XML檔案後,生成基於此XML的版面配置的view。
由於我透過某些教材學Android,我仔細地查了一下LayoutInflater所使用的方法inflate,感覺很模糊,所以查到了一篇文章
配合著文章我重新看了官方的說法,大概理解了一下它那模糊的說明。首先是有關第三個參數的說明:
Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.
然後是回傳值的說明:
The root View of the inflated hierarchy. If root was supplied and attachToRoot is true, this is root; otherwise it is the root of the inflated XML file.
就我對該文章粗淺的認知,第三個參數是決定由第一個參數建立的view的root是否為第二個參數帶進來的view,換句話說,如果我們能夠為第一個參數所建立的view決定他的root,而非是未來的某時,那麼第三個參數可以給他true,反之,我們無法決定或是未來的某刻才會決定他的root,就只能給他false。
那第二個參數到底是什麼呢?根據官方的文章,root主要是作為實際上或是假想上的產生出來的hierarchy的parent而存在,而作為他的parent的目的是要提供一組LayoutParams給hierarchy與其parent之間的關係,亦即,hierarchy在其parent中的位置之類的性質。假設attachToRoot是false,那root將作為假想上的hierarchy的parent,提供他一組LayoutParams,讓hierarchy之後擁有parent時,就可以使用這組LayoutParams加進去parent裡面。即使attachToRoot是false也要提供root的原因是,這樣在hierarchy加入到parent時,才有正確的位置與大小,不然他會試著用預設的方式(generateDefaultLayoutParams)去取得,而這樣的值未必是你想要的,所以可以的話,你能取得root的話,就一定要把root傳進去。
那attachToRoot為true時,回傳的值就是root和hierarchy的組合,如果是false,那就是inflate出的hierarchy,而hierarchy自己會作為自己的root。
所以LayoutInflater不僅僅是製作某些特定元件才會使用而已,重點是建立View與其parent之間關聯的功能。

留言