infrate時の引数 attachToRoot
は常にfalseにしとけばOKという
おまじないでこれまで問題なくやってきたが
trueにするケースに遭遇したのでメモ
遭遇ケース
- LinearLayoutにViewを繰り返しaddしたい
- 対象のViewはmergeタグを使用している
val tagsLayout: LinearLayout = <省略> val tags = arrayOf ("漫画", "JOJO", "集英社") tags.forEach{ tag -> val tagView = inflator.inflate(R.layout.tag, tagsLayout, attachToRoot = true) // tagsLayoutが返却される tagView.findViewById(R.id.name).text = "hoge" //idが同じなので常に1件目が取得されてしまう }
学んだ事
merge
タグで記述されたlayout.xmlを inflateする場合にはattachToRoot
がtrueでないとエラーになるattachToRoot
がtrueになっていると明示的にaddViewを書かなくても親ViewにaddViewされる。- inflateの戻りのViewがinflateしたlayoutのViewではなくその親Viewが返る
特に3でinflateしたはずのViewからfindViewById()しても常に1つ目のViewが取れてきてハマった。