如何将抽象与 ViewBinding 与基本活动一起使用? [英] How to use abstraction with ViewBinding with base activity?

查看:36
本文介绍了如何将抽象与 ViewBinding 与基本活动一起使用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个基类,以便子类的所有绑定都将设置在基类中

I was making a base class so that all bindings for child will be set in base

我已经做到了这一点

abstract class BaseActivity2<B : ViewBinding?, T : BaseViewModel?> : AppCompatActivity() {
    private var viewBinding: B? = null
    private var baseViewModel: T? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

但是我无法在 oncreat() 中绑定视图一般我们在视图绑定中绑定布局为

but am unable to get a way to bind view in oncreat() generally we bind layout in view binding as

binding = ActivityLoginBinding.inflate(layoutInflater)
        setContentView(binding.root)

但我正在寻找基本活动中的通用方式

but i am looking for generalized way in base activity

推荐答案

其他答案也可以解决问题,但我想以一种干净的方式来做.

Other answer will also solve problem but I would like to do in a clean way.

我的基类

abstract class BaseVMActivity<VM : ViewModel, B : ViewBinding> : BaseActivity() {

    lateinit var viewModel: VM
    lateinit var binding: B


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewModel = ViewModelProvider(this, factory).get(getViewModelClass())
        binding = getViewBinding()
        setContentView(binding.root)
    }

    private fun getViewModelClass(): Class<VM> {
        val type = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
        return type as Class<VM>
    }

    abstract fun getViewBinding(): B

}

我的活动:

class MainActivity : BaseVMActivity<AppViewModel, ActivityMainBinding>() {
    override fun getViewBinding() = ActivityMainBinding.inflate(layoutInflater)
   
}

现在我可以直接访问 viewModel 或绑定:

Now I can directly access viewModel or binding:

fun dummy(){
        binding.bvReport.text = viewModel.getReportText()
    }

这篇关于如何将抽象与 ViewBinding 与基本活动一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆