【问题标题】:Compose View instead of Native view for marker's info window为标记的信息窗口撰写视图而不是本机视图
【发布时间】:2022-11-10 13:25:11
【问题描述】:

我正在使用撰写地图库来显示标记集群。现在要显示一个自定义信息窗口适配器,我想使用 compose。我遵循了撰写通过的互操作性的documentation撰写视图.但是当我添加撰写视图在信息窗口方法中,我收到了找不到窗口重组器的错误。

找不到windowRecomposer;查看androidx.compose.ui.platform.ComposeView{e560fcf V.​​E............I. 0,0-0,0} 未附加到窗口

这是我的代码 sn-p。

 clusterManager?.markerCollection?.setInfoWindowAdapter(object : InfoWindowAdapter {
    override fun getInfoContents(p0: Marker): View? {
        return null
    }

    override fun getInfoWindow(p0: Marker): View {
        val composeView = ComposeView(context).apply {
            setContent {
                Text("Hello World")
            }
        }
        return composeView
    }
})

那么有什么方法可以在getInfoWindow()中使用compose函数呢?

【问题讨论】:

    标签: android kotlin android-jetpack-compose android-jetpack


    【解决方案1】:

    所以我找到了解决方法,不确定这是否正确。任何 cmets 都是有价值的。

    因此,根据ComposeView,只有当视图附加到窗口或显式设置父 CompositionContext 时才会发生初始组合。

    信息窗口视图的工作方式是它们不将视图附加到窗口,而是从视图创建位图并显示该位图。

    这在撰写地图的ComposeInfoWindowAdapter 中也有提及。

    因此,按照 ComposeInfoWindowAdapter 的示例,您需要一个父视图来临时将 ComposeView 附加到窗口,并在渲染标记信息窗口后删除父视图。

    我们正在使用 LocalView.current 来获取当前的 ComposeView。并通过 rememberCompositionContext 创建 CompositionContext。

    完成此操作后,集群管理器的标记将支持撰写功能作为信息窗口。

    val currentView = LocalView.current
    val compositionContext = rememberCompositionContext()
    
    val markerCollection = clusterManager?.markerCollection
    val infoWindowAdapter = ClusterItemInfoWindowAdapter((currentView as ViewGroup), compositionContext)
                        markerCollection?.setInfoWindowAdapter(infoWindowAdapter)
    
    class ClusterInfoWindowAdapter(
        private val viewGroup: ViewGroup,
        private val compositionContext: CompositionContext
    ) : GoogleMap.InfoWindowAdapter {
    
        private val infoWindowView: ComposeView
            get() = ComposeView(viewGroup.context).apply {
                viewGroup.addView(this)
            }
    
        override fun getInfoContents(marker: Marker): View? {
            //Override this method if you want to set only content with default background
            return null
        }
    
        override fun getInfoWindow(marker: Marker): View {
            return infoWindowView.applyAndRemove(compositionContext) {
                MarkerContent(marker)
            }
        }
    
        private fun ComposeView.applyAndRemove(
            parentContext: CompositionContext,
            content: @Composable () -> Unit
        ): ComposeView {
            val result = this.apply {
                setParentCompositionContext(parentContext)
                setContent(content)
            }
            (this.parent as? MapView)?.removeView(this)
            return result
        }
    
        @Composable
        fun MarkerContent(marker: Marker) {
            //Show anything here
        }
    }
    

    【讨论】:

      【解决方案2】:

      Compose 有一种方法可以更改标记的信息窗口,这取决于您调用的标记函数。 Marker 将使用 Gmaps 信息窗口。 MarkerInfoWindow 可以让您自定义信息窗口。 MarkerInfoWindowContent 可让您仅为信息窗口自定义内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-23
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多