[英]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.