如何在 1.0.0-beta01 的 Compose 块中添加自定义视图(从视图扩展)

时间:2021-03-17 01:21:43

标签: android android-layout android-jetpack-compose

我正在尝试通过函数 AndroidView(viewBlock = { customView}) 将自定义视图组件包含到 Compose 部分,这适用于以前的版本,但现在对于版本 1.0.0-beta01 不起作用,我找不到新的方法来做到这一点。

代码如下:

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    val view = inflater.inflate(R.layout.fragment_recipe_lis, container, false)
    view.findViewById<ComposeView>(R.id.compose_view).setContent {
        Text("This is a compose view inside a layout")
        Spacer(modifier = Modifier.padding(10.dp))
        CircularProgressIndicator()
        Spacer(modifier = Modifier.padding(10.dp))
        Text(text = "Neat")
        Spacer(modifier = Modifier.padding(10.dp))

        val customView = HorizontalDottedProgress(LocalContext.current)
        AndroidView(viewBlock = { customView}) // Error here with the function definition
    }
    return view
}

也许你们中的一个人知道。谢谢。

2 个答案:

答案 0 :(得分:1)

你必须传递一个工厂而不是视图的实例

AndroidView(factory = { HorizontalDottedProgress(it) })

AndroidView(::HorizontalDottedProgress)

如果您需要配置视图,请在尾随 lambda 中进行

AndroidView(::HorizontalDottedProgress) { customView ->
    customView.doSomething()
}

documentation中阅读更多

答案 1 :(得分:1)

对于 1.0.0-beta02AndroidView 构造函数需要一个 factory 参数:

<块引用>

组成从 factory 获得的 Android 视图。 factory 块只会被调用一次以获取要组合的 View,并且它也保证在 UI 线程上被调用。

示例:

    //option 1
    val customView = TextView(LocalContext.current).apply { text = "New Text View" }
    AndroidView(factory = { customView })

    //option 2
    AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })

    //Option 3
    var size by remember { mutableStateOf(100) }
    AndroidView(::TextView,
        Modifier
            .background(Color.Blue)) { view ->
        view.layoutParams = ViewGroup.LayoutParams(size, size)
        view.apply { text = "This is the 3rd TextView" }  }
    }

在您的情况下,您可以只使用其中之一:

    val customView = HorizontalDottedProgress(LocalContext.current)
    AndroidView(factory = { customView }) 

    AndroidView({ context -> HorizontalDottedProgress(context).apply { /* ... */ } })

    AndroidView(::HorizontalDottedProgress) { view ->
        view.apply { /*..*/ }
    }