ComposeView随笔随记-把旧的xml加载在新的composeUI当中

在composeUI当中来预览

简单示例

@Preview
@Composable
fun OldStyFragmentUIPreview() {
    AndroidView(
        factory = { context ->
            LayoutInflater.from(context/*传入到这里*/).inflate(R.layout.preferences, null/*上一级元素*/)
        },
        modifier = Modifier.fillMaxSize()//变大变高
    )
}

此外,还有update选项可以加入

update = { view ->
            // 这里可以对 View 进行后续的更新操作
}

不使用id查找

使用ViewBinding

多个Fragment需要在res/values/ids.xml当中指定id

否则退出删除界面就会删干净然后出问题(

然后就是Android developer的这个示例

class ExampleFragmentMultipleComposeView : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = LinearLayout(requireContext()).apply {
        addView(
            ComposeView(requireContext()).apply {
                setViewCompositionStrategy(
                    ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
                )
                id = R.id.compose_view_x
                //jklhlhkjhkhj
            }
        )
        addView(TextView(requireContext()))
        addView(
            ComposeView(requireContext()).apply {
                setViewCompositionStrategy(
                    ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
                )
                id = R.id.compose_view_y
                // gyifvgvgyhguih
            }
        )
    }
}
<resources>
  <item name="compose_view_x" type="id" />
  <item name="compose_view_y" type="id" />
</resources>

区分

在旧的布局/Fragment 里手动塞进一个Compose区域 和 在Compose 代码里塞进一个旧的XML/View

前者

只是一个静态的UI(或者说组件?),有compose管理

addView(ComposeView(...))

后者

val composeViewInFragment = ComposeView(requireContext()).apply{}

在Fragment继承的类当中使用requireContext()来获取context
在@compose当中则使用本地组合变量

val context = LocalContext.current
posted @ 2026-03-29 23:09  气温骤降  阅读(5)  评论(0)    收藏  举报