osmdroid 地图在切换选项卡后消失

问题描述 投票:0回答:1

我想使用 OSMdroid 显示地图。我有一个单例来创建 MapView:

object MapViewSingleton {
    private var mapView: MapView? = null

    fun getMapView(context: Context): MapView {
        if (mapView == null) {
            mapView = createMapView(context)
        }
        return mapView!!
    }

    private fun createMapView(context: Context): MapView {
        if (mapView != null) {
            if (mapView!!.parent != null) {
                (mapView!!.parent as ViewGroup).removeView(mapView)
            }
        }
        val mapView = MapView(context)

        Configuration.getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(context))
        Configuration.getInstance().userAgentValue = "Test"

        mapView.setTileSource(TileSourceFactory.MAPNIK)
        mapView.setMultiTouchControls(true)

        return mapView
    }
}

我使用这个可组合函数来显示地图:

@Composable
fun OsmdroidMapView() {
    val mapView = MapViewSingleton.getMapView(LocalContext.current)
    AndroidView(
        modifier = Modifier.fillMaxSize(),
        factory = {
            mapView
        }
    )
}

当我第一次进入地图选项卡时,地图会显示在显示屏上。当我切换到另一个选项卡并返回地图选项卡时,地图消失了。我现在只能看到一个空网格。

这是我实现选项卡的方式:

val items = listOf(
                BottomNavigationItem(
                    route = "settings",
                    title = "Einstellungen",
                    selectedIcon = Icons.Filled.Settings,
                    unselectedIcon = Icons.Outlined.Settings
                ),
                BottomNavigationItem(
                    route = "map",
                    title = "Karte",
                    selectedIcon = Icons.Filled.Place,
                    unselectedIcon = Icons.Outlined.Place
                ),
                BottomNavigationItem(
                    route = "data",
                    title = "Daten",
                    selectedIcon = Icons.Filled.Done,
                    unselectedIcon = Icons.Outlined.Done
                )
            )

            var selectedItemIndex by rememberSaveable { mutableStateOf(0) }
            val navController = rememberNavController()
            Scaffold(
                bottomBar = {
                    NavigationBar {
                        items.forEachIndexed { index, item ->
                            NavigationBarItem(
                                selected = selectedItemIndex == index,
                                onClick = {
                                    selectedItemIndex = index
                                    navController.navigate(item.route)
                                },
                                label = {
                                    Text(text = item.title)
                                },
                                icon = {
                                    BadgedBox(badge = {}) {
                                        Icon(
                                            imageVector = if (index == selectedItemIndex) {
                                                item.selectedIcon
                                            } else item.unselectedIcon,
                                            contentDescription = item.title
                                        )
                                    }
                                }
                            )
                        }
                    }
                }
            ) {
                NavHost(navController = navController, startDestination = "settings") {
                    composable("map") {
                        OsmdroidMapView()
                    }
                    composable("settings") {
                        Settings()
                    }
                    composable("data") {
                        Data()
                    }
                }
            }

任何人都可以看到我犯的错误并告诉我为什么我在切换选项卡后只能看到一个空网格吗?

android kotlin android-jetpack-compose osmdroid
1个回答
0
投票

我不熟悉 osmdroid,但您可以尝试执行

MapView
文档建议的操作:

从版本 6.0.0 开始,请分别调用 onPause() 和 onResume() 来尊重 android 视图生命周期

AndroidView
之后添加此内容。

    val lifecycleOwner = LocalLifecycleOwner.current
    DisposableEffect(lifecycleOwner) {
        val observer = LifecycleEventObserver { _, event ->
            if (event == Lifecycle.Event.ON_START) {
                mapView.onResume()
            } else if (event == Lifecycle.Event.ON_STOP) {
                mapView.onPause()
            }
        }
        lifecycleOwner.lifecycle.addObserver(observer)
        onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
    }
© www.soinside.com 2019 - 2024. All rights reserved.