[英]Databinding in recyclerView item doesn't work with the fragment viewModel
[英]onClick with dataBinding an ViewModel doesn't work
我正在處理一個項目並使用databinding
和navigation
實現 MVVM 模型。 My button
在一個用drawer menu item
打開的fragment
上,問題是當我點擊按鈕時它什么也不做,調試器沒有進入導航方法,我真的不知道我做錯了什么,可以有人幫忙嗎?
MYACCOUNT CLASS
:
class MyAccountFragment : BaseFragment() {
private val vm: MyAccountViewModel by viewModel()
override fun getViewModel(): BaseViewModel = vm
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentMyAccountBinding.inflate(inflater, container, false)
context ?: return binding.root
injectFeature()
setToolbar(binding)
subscribeUi(binding)
return binding.root
}
/**
* set toolbar
* **/
private fun setToolbar(binding: FragmentMyAccountBinding) {
binding.appBarLayout.backClickListener = (activity as MainActivity).createOnBackClickListener()
}
/**
* set ui
* **/
private fun subscribeUi(binding: FragmentMyAccountBinding) {
binding.viewModel = vm
}
}
MYACCVIEW模型
class MyAccountViewModel constructor() : BaseViewModel() {
fun onAddRoomClick()
{
navigate(MyAccountFragmentDirections.actionMyAccountFragmentToAddRoomFragment())
}
}
在 xml 中我實現了
android:onClick="@{() -> viewModel.onAddRoomClick()}"
我對我所有的Fragments
和ViewModels
都使用這種模式,我真的不知道為什么它什么都不做,vm 初始化。 在另一個drawermenu fragment
我也有 onClick 方法,它導航到另一個片段。 因此,如果有人知道有幫助的解決方案,請提前致謝。
答案是在 viewModel 的初始化中。
xml 中的 onClick 方法在包含在 fragment_layout 中的 content_layout 中,而不是 binding.viewModel = vm 我必須做 binding.content_layout.viewModel = vm。
private fun subscribeUi(binding: FragmentMyAccountBinding) {
binding.contentMyAccount.viewModel = vm
}
ViewModel 不應該處理任何類型的導航,它只會從 UI 接收事件並將其傳遞給控制器(可能是片段或活動),后者將處理導航......
因此,解決您的問題的一種方法是執行以下操作:
視圖模型
class MyAccountViewModel constructor() : BaseViewModel() {
private val _navigateToRoomFragEvent = MutableLiveData<Boolean>(false)
val navigateToRoomFragEvent:LiveData<Boolean>
get()=_navigateToRoomFragEvent
fun onAddRoomClick()
{
_navigateToRoomFragEvent.value=true
}
fun resetNavigation(){
_navigateToRoomFragEvent.value=false
}
}
控制器(活動或片段)
**onCreate() 內部(如果是活動)**
viewModel.navigateToRoomFragEvent.observe(this,Observer{navigate->
//boolean value
if(navigate){
navController.navigate(//action)
}
viewModel.resetNavigation() //don't forget to reset the event
})
onActivityCreated(如果是片段)
viewModel.navigateToRoomFragEvent.observe(viewLifeCycleOwner,Observer{navigate->
//boolean value
if(navigate){
navController.navigate(//action)
}
viewModel.resetNavigation() //don't forget to reset the event
})
希望能幫助到你,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.