19
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LayoutInflater.inflateのattachToRootとは何か?

Last updated at Posted at 2021-08-21

##はじめに
Fragment等を扱うときなどにおまじないとして書いていたLayoutInflaterのinflateメソッドの第3引数attachToRootの意味がよくわからなかったので調べてみました。

##LayoutInflaterについて
LayoutInflaterとはxmlをViewオブジェクトに変換するものです。ドキュメントを確認したところLayoutInflater内のinflateメソッドは色々種類がありましたが、多分一番多く使われているのが

open fun inflate(resource: Int, root: ViewGroup?, attachToRoot: Boolean): View!

のタイプだと思います。これの第一引数ではViewに変換したいlayoutのxmlを指定します。第二引数についてはドキュメントの説明をdeepLで翻訳すると

ViewGroup。オプションで、生成された階層の親となるビュー(attachToRootがtrueの場合)、または単に、返された階層のルートのLayoutParams値のセットを提供するオブジェクト(attachToRootがfalseの場合)。

となっています。これは生成するViewをセットする親のViewGroupを指定するということだと思います。

##attachToRoot
まずはドキュメントのattachToRootの説明を読んでみます。

attachToRoot Boolean: 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.

やっぱりよく意味がわかりません。ここの部分の解説としてstack overflowの記事が見つかりました。ざっくりいうと、作成したViewを、inflateの第二引数で渡したViewGroupにセットするのを、自動でするかか手動でするかということを指定できるみたいです。なので上のstack overflow内の説明とほぼ同じになってしまいますが、

val view = LayoutInflater.inflate({"xmlのlayoutリソースID"},parent,false)
parent.addView(view)   
LayoutInflater.inflate({"xmlのlayoutリソースID"},parent,true)

上の二つが同じ意味になるということです。

それぞれのinflateの引数の意味がわかったところでもう少し掘り下げてみます。attachToRootはBooleanですが僕はここをtrueにしたことがありません。なぜいつもfalseなのかも調べてみました。

僕がこのLayoutInflaterを記述していたのは大抵FragmentのonCreateViewやRecyclerViewのAdapterのonCreateViewHolder等でした。これらのようなタイミングではLayoutInflater.inflateでViewを作成するタイミングでさらにそれを親のViewGroupにセットする必要がありません。なぜならFragmentを作成するときはfragmentManager、RecyclerViewの場合はAdapterが代わりにその役割を果たしてくれているからです。なのでonCreateViewやonCreateViewHolderの内部でLayoutInflater.inflateをする時にattachToRootをtrueにしてしまうと、親ViewGroupに同じViewを二つセットすることになってしまいIllegalStateExceptionが起きてしまいます。なのでfalseをセットしないといけないらしいです。

##感想
Androidの勉強を始めた初期の頃からおまじないとして使っていたコードの意味を前より理解できるようになったのでよかったです。

##参考文献
https://developer.android.com/reference/kotlin/android/view/LayoutInflater#inflate(kotlin.Int,%20android.view.ViewGroup,%20kotlin.Boolean)

19
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?