一、配置说明
作用位置
需在模块级
build.gradle
或build.gradle.kts
文件的android {}
块内添加:android { buildFeatures { viewBinding = true // Kotlin DSL 语法 } }
android { buildFeatures { viewBinding true // Groovy 语法 } }
生成规则
为每个 XML 布局文件(如
activity_main.xml
)生成对应的绑定类(如ActivityMainBinding
)。绑定类包含布局中所有带
android:id
的视图引用,无需手动调用findViewById()
。
忽略特定布局
若无需为某布局生成绑定类,可在其根节点添加:
<LinearLayout
...
tools:viewBindingIgnore="true">
</LinearLayout>
二、使用示例
1. Activity 中绑定视图
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root) // 设置根视图
// 直接访问视图(类型安全 & 空安全)
binding.textView.text = "Hello, View Binding!"
binding.button.setOnClickListener {
Toast.makeText(this, "Clicked", Toast.LENGTH_SHORT).show()
}
}
}
2. Fragment 中绑定视图(避免内存泄漏)
class ExampleFragment : Fragment() {
private var _binding: FragmentExampleBinding? = null
private val binding get() = _binding!! // 非空断言
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentExampleBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.textView.text = "Fragment Loaded"
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null // 释放视图引用
}
}
三、核心优势
特性 |
说明 |
---|---|
类型安全 |
自动推断视图类型(如 |
空安全 |
仅绑定布局中声明 |
性能优化 |
编译时生成代码,无运行时反射开销,比 |
代码简洁 |
一行绑定代替多次 |
五、与 DataBinding 对比
特性 |
View Binding |
Data Binding |
---|---|---|
视图绑定 |
✅ |
✅ |
数据绑定 |
❌ |
✅(支持 |
双向绑定 |
❌ |
✅ |
性能开销 |
⚡️ 接近零开销 |
⚠️ 较高(需处理表达式逻辑) |
适用场景 |
纯 UI 操作 |
数据驱动 UI(如 MVVM 架构) |