【发布时间】:2021-12-31 00:05:42
【问题描述】:
我是 Android 开发和制作 Android 地图应用的新手。现在,我有三个片段:一个是地图,两个是位置的回收站视图列表。在我的主要活动中,它们都在导航主机中。我想要做的是单击列表中的位置,它会将我带到地图片段并在地图上放置一个标记。
我的想法是在我的列表片段中设置视图模型,并在我的地图片段中获取视图模型。
我的视图模型:
private val _location = MutableLiveData<Location>()
val location: LiveData<Location> = _location
fun setLocation(location: Location) {
_location.value = location
}
我在位置片段中的点击监听器:
private var clickListenerImpl = object : LocationsAdapter.OnClickListener {
override fun onNameClick(location: Location) {
viewModel.setLocation(location)
view?.findNavController()?.navigate(
LocationsFragmentDirections.actionLocationsToMap()
)
}
}
我的地图就绪回调:
viewModel.location.observe(viewLifecycleOwner, { location ->
googleMap.addMarker(
MarkerOptions()
.position(LatLng(location.lat, location.lng))
)
})
我使用的视图模型对吗?我无法在地图片段中获取我的视图模型数据,也无法在我的其他列表片段中获取。我尝试在位置和地图片段中使用日志。似乎它在位置片段中正确设置了视图模型,但地图片段仍然认为它是空的,所以它不会更新。或者有没有更好的方法来代替使用视图模型?
谢谢大家。我真的很想给大家点赞,但我的名声太低了,不能这样做。
虽然我真的很想使用 ViewModel,但我仍然无法让它在活动范围内工作。也许当我在一个新片段中启动它时,它会覆盖它的旧值?我不知道。
private val viewModel: LocationViewModel by activityViewModels {
LocationViewModelFactory((requireActivity().application as LocationApplication).repository)
}
我的解决方案已更改为使用 SafeArgs。将纬度和经度转换为浮点类型需要额外的步骤,但可以完成工作。
【问题讨论】: