微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在基本活动中将抽象与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 举报,一经查实,本站将立刻删除。