使用 ViewBinding 为具有相同视图的多个活动创建基本活动

Create a Base Activity with ViewBinding for multiple activities with same views

提问人:seba123neo 提问时间:10/26/2023 更新时间:10/26/2023 访问量:76

问:

我有 20 个不同的活动,具有相同的 MaterialTextView(所有活动中的名称相同)

在所有活动(在 onCreate 事件中)中,我使用相同的文本初始化 TextView:

textview.text = "Hello"

每个活动都有不同的绑定 XML,如 ActivityOneBinding、ActivityTwoBinding、ActivitythreeBinding 等

我需要通过创建一个要继承的 actract 类来减少所有活动中的“重复代码”,并在其中设置一次文本

我尝试过要继承的抽象类示例,但是textview的名称无法识别,因为它们是不同的绑定

Android Kotlin 抽象类 android-viewbinding

评论

0赞 ItzDavi 10/26/2023
也许我错了(请有经验的人纠正我),但我认为这不是一个好主意。绑定的诞生是为了简化从活动中删除样板代码的 XML 访问。与其他活动/类的“共享”绑定可能是错误的设计。从抽象类继承可能会更糟。
0赞 Ivo 10/26/2023
不确定是否可以通过反射来完成。否则,您可以尝试为此使用老式的findViewById()

答:

1赞 Marcin Mrugas 10/26/2023 #1

我尝试过要继承的抽象类示例,但是textview的名称无法识别,因为它们是不同的绑定

可以传递对 TextView 对象的引用,而不是传递视图名称。在这个例子中,这样的函数是:getHeaderView()

BaseActivity.kt (英语)

abstract class BaseActivity<VB : ViewBinding>() : AppCompatActivity() {
    abstract fun getHeaderView(): TextView

    protected lateinit var  binding: VB

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

    override fun onPostCreate(savedInstanceState: Bundle?) {
        super.onPostCreate(savedInstanceState)
        val headerView = getHeaderView()
        headerView.text = "Hello world!"
    }

    abstract fun inflateView(): VB
}
class SecondActivity : BaseActivity<SecondActivityBinding>() {

    override fun getHeaderView(): TextView = binding.headerView

    override fun inflateView() = SecondActivityBinding.inflate(layoutInflater)
}