我是 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。將緯度和經度轉換為浮點型別需要額外的步驟,但可以完成作業。
uj5u.com熱心網友回復:
您是否使用活動范圍的 ViewModel?您需要使用活動范圍的 ViewModel 或導航范圍的 viewModel 才能使其作業。如果您在地圖和串列片段中使用片段范圍的 ViewModel。該片段將獲得您的 ViewModel 的不同實體。在我看來,我只是將位置資料作為片段引數傳遞而不是共享 ViewModel。
uj5u.com熱心網友回復:
該ViewModel是這樣的:
每個
ViewModel都(應該)系結到單個LifeCycleOwner,它指的是Fragment或Activity。換句話說, EachViewModel系結到單個FragmentorActivity。為了
ViewModel's在 之間共享 ( ) 資料Fragments,使用SharedViewModel模式,想法是,這ViewModel將系結到外部 (父)Activity,并且對于它的每個子項,Fragment您可以ViewModel使用以下方法獲取此實體:ViewModelProvider(requireActivity()).get(MainViewModel::class.java)
uj5u.com熱心網友回復:
我想到了兩種在片段之間共享 ViewModel 資料的方法。
- 使用一個activityViewModels()。只要父 Activity 處于活動狀態,這將使 ViewModel 保持活動狀態。請參閱使用 ViewModel 在片段之間共享資料。
private val model: SharedViewModel by activityViewModels()
編輯:由 activityViewModels 與 ViewModelFactory 一起使用
private val model: SharedViewModel by activityViewModels() {
ExampleViewModelFactory(
repository
)
}
- 第二種方法是在 Activity 中實體化一個 ViewModel,然后在每個 Fragment 中抓取要使用的物件。幾乎就像一個單身人士。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362393.html
