源码地址:https://gitee.com/zhaohbo/dev_compose_fragment

Jetpack Compose 和 Fragment混合嵌入页面

Fragment中使用Compose

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    ): View {
        return ComposeView(requireContext()).apply {
            setContent {
                Column(
                    modifier = Modifier
                        .fillMaxWidth()
                        .background(Color.Red)
                        .padding(8.dp)
                ) {
                    Text(
                        "这里是被嵌入的测试Fragment页面",
                        color = Color.White, fontSize = 21.sp,
                        modifier = Modifier.padding(16.dp)
                    )
                }
            }
        }
    }

Compose中使用Fragment

val context = LocalContext.current
if (context is FragmentActivity) {
    AndroidView(factory = {
        FragmentContainerView(it).apply {
            id = View.generateViewId()
            layoutParams = ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT
            )
        }
    }, update = { view ->
        context.supportFragmentManager.beginTransaction().replace(view.id, HDevFragment())
            .commitNowAllowingStateLoss()
    })
}

总结

主要通过ComposeView和AndroidView的使用实现。在传统View布局中,ComposeView相当于把Compose转换为View布局,通过ComposeView中的setContent进行界面布局书写;在Compose中,AndroidView提供了显示传统View的功能,只需要实现factory、update内容即可,上述代码通过FragmentContainerView容器进行构建,在update中进行实际fragment的嵌入。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐