如何解决如何在基本活动中将抽象与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)
但是我正在寻找基本活动的通用方式
解决方法
您可以在构造函数中声明一个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) })
,
其他答案也可以解决问题,但我想以一种简洁的方式来做。
我的基础班
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()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。