首页 > 解决方案 > 如何生成数据绑定布局膨胀?

问题描述

我想做一个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
    }

标签: android

解决方案


有一种方法可以抽象出特定的 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
}

推荐阅读