You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ViewBinding创建抽象基Activity,统一处理多页面重复逻辑

统一处理多Binding类的TextView初始化

方案1:通过根视图+findViewById实现(推荐)

利用所有布局中TextView的同名ID,直接在基类里通过根视图查找控件,完全避开Binding类差异的问题:

  1. 定义抽象基类BaseActivity,统一处理Binding初始化和TextView设置:
abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
    protected lateinit var binding: T

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = getViewBinding()
        setContentView(binding.root)
        // 直接通过根视图查找同名ID的TextView并设置文本
        binding.root.findViewById<MaterialTextView>(R.id.tv_common).text = "Hello"
    }

    // 子类只需实现具体的Binding实例化逻辑
    abstract fun getViewBinding(): T
}
  1. 子类Activity继承基类,实现getViewBinding方法:
class ActivityOne : BaseActivity<ActivityOneBinding>() {
    override fun getViewBinding(): ActivityOneBinding {
        return ActivityOneBinding.inflate(layoutInflater)
    }
}

注意:确保所有Activity布局中的MaterialTextView的ID完全一致(比如示例中的tv_common)

方案2:用接口约束Binding类

通过定义接口强制所有Binding类暴露目标TextView,基类通过接口访问控件:

  1. 创建接口,约定TextView的暴露方式:
interface HasCommonTextView {
    val commonTextView: MaterialTextView
}
  1. 修改基类逻辑,将Binding强转为接口并设置文本:
abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
    protected lateinit var binding: T

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = getViewBinding()
        setContentView(binding.root)
        // 强转后直接访问接口定义的属性
        (binding as? HasCommonTextView)?.commonTextView?.text = "Hello"
    }

    abstract fun getViewBinding(): T
}

注意:需要确保布局中TextView的ID为common_text_view(下划线命名),这样自动生成的Binding类会生成驼峰式的commonTextView属性,自然符合接口要求,无需手动修改自动生成的Binding类

方案3:反射实现(不推荐)

通过反射获取Binding类中的TextView属性,虽然可行但会带来性能损耗和代码可读性问题,仅作为备选:

abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
    protected lateinit var binding: T

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = getViewBinding()
        setContentView(binding.root)
        try {
            // 反射获取Binding类中对应属性(需确保属性名与布局ID驼峰一致)
            val field = binding.javaClass.getDeclaredField("commonTextView")
            val textView = field.get(binding) as MaterialTextView
            textView.text = "Hello"
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    abstract fun getViewBinding(): T
}

内容的提问来源于stack exchange,提问作者seba123neo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:53:14