如何在基本活动中将抽象与ViewBinding一起使用?

时间:2020-09-01 10:56:29

标签: android generic-programming abstraction android-viewbinding

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

我已经做完了

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()中绑定视图 通常我们在视图绑定中将布局绑定为

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

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

2 个答案:

答案 0 :(得分:3)

您可以在构造函数中声明一个lambda属性以创建绑定对象:

abstract class BaseActivity<B : ViewBinding>(val bindingFactory: (LayoutInflater) -> B) : AppCompatActivity() {
    private lateinit var binding: B

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = bindingFactory(layoutInflater)
        setContentView(binding.root)
    }

}

然后您可以执行以下操作:

class LoginActivity : BaseActivity<ActivityLoginBinding>({ ActivityLoginBinding.inflate(it) })

答案 1 :(得分:3)

其他答案也可以解决问题,但我想以一种简洁的方式来做。

我的基础班

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或绑定:

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