Fragment in Jetpack Compose は動くのか

  • diary
  • android

結論

動くが本番環境で使うのは怪しいと思っている

Jetpack Compose

新しい Android アプリ向け UI キットである Jetpack Compose はこれまでの XML で構成されている View との高い相互運用性があります。 そのため既存の View に Compose を含めたり、画面の Compose で実装して一部に これまでの View を使いまわす実装が簡単に行えます。

What's new in Jetpack Compose
What's new in Jetpack Compose | Youtube.com

相互運用 API  |  Jetpack Compose  |  Android Developers

相互運用 API のドキュメントページを読むと、どちらの使い方もすぐ理解できると思いますが、このドキュメントには View を Compose に埋め込む方法は紹介されているものの、Fragment を Compose に埋め込むことについては推奨する/しないを含めて一切の記載がありません。

Fragment in Jetpack Compose

試してみると意外にも普通に動きます。もちろんFragmentContainerViewだけの XML を用意して Inflateする方法でも動きます。 FragmentContainerViewを直接呼び出す際は View.generateViewId で ID 振りが出来ます。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposeFragmentSampleTheme {
                Surface(color = MaterialTheme.colors.background) {
                    FragmentContainer(
                        fragmentManager = supportFragmentManager,
                        fragment = MainFragment(),
                    )
                }
            }
        }
    }
}

@Composable
fun FragmentContainer(fragmentManager: FragmentManager, fragment: Fragment) {
    AndroidView(
        factory = { context ->
            FragmentContainerView(context).apply {
                id = View.generateViewId()
            }
        },
        modifier = Modifier.fillMaxSize(),
    ) {
        val transaction = fragmentManager.beginTransaction()
        transaction.replace(it.id, fragment)
        transaction.commit()
    }
}