我正在创建一个基类,以便所有对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)
但是我正在寻找基本活动的通用方式
答案 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()
}