基于ViewBinding创建抽象基Activity,统一处理多页面重复逻辑
统一处理多Binding类的TextView初始化
方案1:通过根视图+findViewById实现(推荐)
利用所有布局中TextView的同名ID,直接在基类里通过根视图查找控件,完全避开Binding类差异的问题:
- 定义抽象基类
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 }
- 子类Activity继承基类,实现
getViewBinding方法:
class ActivityOne : BaseActivity<ActivityOneBinding>() { override fun getViewBinding(): ActivityOneBinding { return ActivityOneBinding.inflate(layoutInflater) } }
注意:确保所有Activity布局中的MaterialTextView的ID完全一致(比如示例中的tv_common)
方案2:用接口约束Binding类
通过定义接口强制所有Binding类暴露目标TextView,基类通过接口访问控件:
- 创建接口,约定TextView的暴露方式:
interface HasCommonTextView { val commonTextView: MaterialTextView }
- 修改基类逻辑,将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
相关产品推荐
相关产品推荐

