android - 如何生成数据绑定布局膨胀?
问题描述
我想做一个BaseFragment。为此,我必须使用 ViewDataBinding 和 ViewModel。使用泛型,我可以使用变量但不能使用静态字段。例如,我必须 Inflate 编写此代码“FragmentSecondBinding.inflate(layoutInflater, container, false)”。所以我尝试了这段代码“T.inflate(layoutInflater,container,false)”但出现了一些错误。ViewModel 也是这样。如何将此代码制作为 BaseCode?
abstract class BaseFragment<T: ViewDataBinding, M : ViewModel> : DaggerFragment(){
abstract val layoutId : T
private lateinit var binding : T
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
private val viewModel by viewModels<M> { viewModelFactory }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = T.inflate(inflater, container, false).apply {
viewmodel = viewModel
}
return binding.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
binding.lifecycleOwner = this.viewLifecycleOwner
}
解决方案
有一种方法可以抽象出特定的 ViewDataBinding,但是,它需要为每个具体的片段实现提供布局资源引用:
protected abstract val layoutResource: Int
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
private val viewModel by viewModels<M> { viewModelFactory }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate(inflater, layoutResource, container, false).apply {
viewmodel = viewModel
}
return binding.root
}
推荐阅读
- java - 查看存储在谷歌云上的数据内容到前端应用程序,而不是下载名为 blob 的文件
- python - 如何在 Keras 的循环中加速 Grad-CAM 计算?
- authorize.net - 我可以在单个 API 调用中获取所有有效的 ARB 订阅吗
- c# - 未定义的命令:“mono_pmip”GDB
- python - 使用正则表达式查找值(包括括号)
- python - 如何在 PyQt5 中离开全屏模式?
- objective-c - 如何:将子视图约束到 safeArea Obj-c
- docker - Docker:执行 shell 脚本时出现错误代码 127
- python - 需要捕获有关 UnexpectedAlertException 的信息
- save - 在 Julia 中并行保存数据