android - onOptionsItemSelected 访问 dataBinding viewModel
问题描述
如何让 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)
}
}
}
推荐阅读
- wpf - WPF 组合框应该只在箭头上打开
- google-analytics - 在站点上安装多个计数器(本地和通用)GA
- node.js - Nodejs同步请求不返回HTML响应
- kubernetes - kubernetes:在同一个 pod 中的另一个容器中调用命令
- java - Java解析MongoDB文件的最佳方法
- c# - 在 FillRectangles 之后获取 Rectangle 的颜色
- android - 谷歌登录可以只用于登录吗?
- javascript - 如何在 JavaScript 中计算表格列?
- c# - 如何以干净和正确的方式缩短长参数列表
- python - 在矩阵中的文本中选择一个字母