如何减少ViewBinding使用 直接调用布局内TextView、EditText等控件
减少ViewBinding冗余调用的实操方案
以下都是Android Kotlin开发中经过验证的无坑方案,不需要引入额外第三方库:
1. 零成本方案:使用Kotlin标准库作用域函数with
不需要修改任何现有配置、不需要额外初始化,直接把binding作为with的接收者,代码块内就可以直接访问所有绑定的控件,没有额外性能开销,适合单函数内多次操作binding控件的场景:
fun setVisibility() = with(binding) { tvFact.visibility = View.VISIBLE tvTimeStamp.visibility = View.VISIBLE progressBar.visibility = View.GONE }
如果代码块里还有当前类的其他成员访问,出现命名冲突时加this@外层类名区分即可,几乎没有学习成本。
2. 全类简化方案:提前提取控件引用为类成员
如果整个Activity/Fragment里大量地方都需要操作某几个固定控件,可以在视图生命周期初始化节点,把控件引用直接赋值给类的成员变量,后续所有位置直接用控件变量即可,不需要每次走binding实例:
// Fragment中示例 private lateinit var tvFact: TextView private lateinit var tvTimeStamp: TextView private lateinit var progressBar: ProgressBar override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 初始化时一次性赋值 tvFact = binding.tvFact tvTimeStamp = binding.tvTimeStamp progressBar = binding.progressBar } // 后续任意位置直接调用即可 fun setVisibility() { tvFact.visibility = View.VISIBLE tvTimeStamp.visibility = View.VISIBLE progressBar.visibility = View.GONE }
注意:Fragment中使用这个方案时,要在
onDestroyView回调里把这些成员变量置空,避免持有视图引用造成内存泄漏;Activity因为视图生命周期和实例生命周期一致,不需要额外处理。
3. 进一步简化:封装通用View扩展
对于设置可见性、设置点击事件这类高频重复操作,可以封装几个顶层扩展函数,减少重复代码:
fun View.visible() { visibility = View.VISIBLE } fun View.gone() { visibility = View.GONE } fun View.invisible() { visibility = View.INVISIBLE }
配合前面的with作用域,代码可以更简洁:
fun setVisibility() = with(binding) { tvFact.visible() tvTimeStamp.visible() progressBar.gone() }
避坑提醒
不要使用已经被官方废弃的kotlinx.android.synthetic插件,这个插件存在命名冲突、生命周期不安全(容易空指针)、跨模块访问失效等问题,Google官方已经明确停止维护,不要为了省几行代码引入隐患。
内容的提问来源于stack exchange,提问作者Привет Здарова
相关产品推荐
相关产品推荐

