我想使用 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()
}
}
}
任何人都可以看到我犯的错误并告诉我为什么我在切换选项卡后只能看到一个空网格吗?
我不熟悉 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) }
}