前人未踏の領域へ アプリ開発編

Android, iOSアプリ開発に関する調査メモ置き場。ほとんどAndroid。はてなダイアリーから移行したため古い記事にはアプリ以外も含まれます。

LayoutInflatorのattachToRootについてのメモ

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件目が取得されてしまう
     
}

学んだ事

  1. merge タグで記述されたlayout.xmlを inflateする場合には attachToRoot がtrueでないとエラーになる
  2. attachToRoot がtrueになっていると明示的にaddViewを書かなくても親ViewにaddViewされる。
  3. inflateの戻りのViewがinflateしたlayoutのViewではなくその親Viewが返る

特に3でinflateしたはずのViewからfindViewById()しても常に1つ目のViewが取れてきてハマった。