onOptionsItemSelected访问dataBinding视图Model



如何在onOptionsItemSelected方法上访问dataBinding viewModel。

class TestFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// viewModel
val viewModelFactory = TestViewModelFactory(
...
)
val viewModel = ViewModelProvider(
this, viewModelFactory).get(TestViewModel::class.java)
// dataBinding
val binding = FragmentTestBinding.inflate(inflater)
binding.lifecycleOwner = this
binding.viewModel = viewModel
return binding.root
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when(item.itemId) {
R.id.test_menu_item -> {
this.findNavController().navigate(
TestFragmentDirections
.actionTestFragmentToAnotherTestFragment(
...
)
)
viewModel.onNavigated() // How to access the viewModel here
true
}
else -> super.onOptionsItemSelected(item)
}
}
}

好的,声明lateinit全局变量,该变量可用于整个类

private lateinit var viewModel : TestViewModel

现在用onCreate((中的工厂初始化viewModel:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// factory
val viewModelFactory = TestViewModelFactory()
// viewModel
viewModel = ViewModelProvider(this, viewModelFactory).get(TestViewModel::class.java)
}

所以整个代码看起来像:

class TestFragment : Fragment() {
private lateinit var viewModel : TestViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// factory
val viewModelFactory = TestViewModelFactory()
// viewModel
viewModel = ViewModelProvider(this, viewModelFactory).get(TestViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// dataBinding
val binding = FragmentTestBinding.inflate(inflater)
binding.lifecycleOwner = this
binding.viewModel = viewModel
return binding.root
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when(item.itemId) {
R.id.test_menu_item -> {
this.findNavController().navigate(
TestFragmentDirections.actionTestFragmentToAnotherTestFragment()
)
viewModel.onNavigated() // How to access the viewModel here
true
}
else -> super.onOptionsItemSelected(item)
}
}
}

最新更新