如何简化 Android 视图绑定授权
Android 视图绑定是什么?如何简化视图绑定授权?
视图绑定是 Android Jetpack 的一部分,Google 在 Google IO/19 的 Android Talk 中引入了视图绑定。下文会对视图绑定进行详细讲解。
什么是视图绑定?
正如 Google 在开发者页面上所说,
- 视图绑定功能可以让开发人员更轻松地编写可以与视图交互的代码。在模块中启动视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。*
在大多数情况下,视图绑定可以替代 findViewById
。
为什么需要视图绑定?
在使用 findViewById
时,每次需要使用视图变量时都要声明,导致视图活动(Activity)/片段(Fragment)中有大量样板代码。而视图绑定的好处在于,只需初始化一个变量就能获得所有视图。
以下是使用 findViewById
的方法:
class MainActivity: AppCompatActivity() {
val logoutButton = findViewById<Button>(R.id.btn_logout)
val overview = findViewById<TextView>(R.id.overview)
overview?.text = userProfile?.overview
logoutButton?.setOnClickListener {
toast("Logout Clicked")
}
}
下面是使用视图绑定的方法:
class MainActivity: AppCompatActivity() {
val binding = ActivityMainBinding.inflate(layoutInflater)
binding.overview.text = userProfile?.overview
binding.btnLogout.setOnClickListener {
toast("Logout Clicked")
}
}
能看出两者的差异吗?
是的,我们只需从生成的视图绑定类中声明绑定变量,就能通过绑定变量访问所有视图 ID。
使用视图绑定还有其他优点:
Type Safety:视图绑定提供了 XML 布局中定义的类型相同的生成方法,因此不需要再进行类型转换。
Null Safety:findViewById
并不是 null safe 的。如果开发者使用的是 Kotlin,可以不用检查所有 null 变量,但如果使用 Java,就会非常抓狂
如何使用视图绑定?
1.在 app/build.gradle
启用 viewBinding
功能:
android {
....
viewBinding {
enabled = true
}
}
2.然后,创建一个 XML 布局。例如,创建一个 activity_sample.xml
。
<LinearLayout xmlns:android="http:// schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:layout_marginBottom="16dp"/>
<Button
android:id="@+id/btnSample"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textStyle="bold"/>
....
</LinearLayout>
....
</ LinearLayout >
3.接着,它会自动生成绑定类——ActivitySampleBinding
类。如果开发者不想自动生成 XML 布局,可以将 tools:viewBindingIgnore="true"
添加到根布局中:
<LinearLayout
...
tools:viewBindingIgnore =“ true” >
...
</ LinearLayout>
4.之后,使用布局填充器对 ActivitySampleBinding
类进行填充。
class MainActivity: AppCompatActivity() {
private lateinit var binding: ActivitySampleBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySampleBinding.inflate(LayoutInflater.from(this))
setContentView(binding.root)
}
}
5.在 Fragment 中的 onCreateView 内设置绑定填充器,返回 binding.root。点击此处查看完整示例。
6.执行以下操作来访问视图:
binding.tvTitle.text =的getString(R.string.sample_title)
binding.btnSample.setOnClickListener {
showMessage( “Sample Button Clicked”)
}
PS:如果你的视图 ID 使用 under_score,会生成驼峰变量。
7.以上就是使用“视图绑定”对视图的设置~
现在的问题是如何通过单行代码编程完成绑定授权呢?
Kotlin 是一门特殊的语言,要想通过单行代码编程完成绑定授权,需要使用 Kotlin 的一个特性——Kotlin 特性授权。(点击这里查看)
我创建此库是为了实现单行代码编程,该库是用 Kotlin 的委托属性与其扩展函数共同创建的。因此,大家的视图中就不需要视图绑定授权的样板文件了。
添加依赖:
将下列代码添加到 build.gradle 中:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
在 app / build.gradle 中启用视图绑定:
android {
....
viewBinding {
enabled = true
}
}
之后,在 app / build.gradle 中添加下列依赖:
dependencies {
....
implementation 'com.github.yogacp:android-viewbinding:x.x.x'
}
如何使用资源库?
1.假设还有 XML 布局,activity_sample.xml。
2.在 Activity 中,只需在绑定变量的末尾添加 by viewBinding()
class MainActivity : AppCompatActivity() {
private val binding: ActivitySampleBinding by viewBinding()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.tvTitle.text = getString (R.string.sample_title)
binding.btnSample.setOnClickListener {
showMessage("Sample Button Clicked")
}
....
}
}
3.例如,在 Fragment 中创建一个 XML 布局 fragment_sample.xml。以下显示了如何授权绑定变量:
class MainFragment : Fragment(R.layout.fragment_sample) {
private val binding: FragmentSampleBinding by viewBinding()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tvFragmentTitle.text = getString(R.string.sample_fragment_title)
binding.btnFragmentSample.setOnClickListener {
showMessage("Sample Fragment Button Clicked")
}
....
}
}
完成啦,我们只需要通过 viewBinding() 授权就可以访问视图绑定了。
总结
视图绑定为视图提供 null-safety 和 type-safety,并且在 Activity/Fragment 中都不需要进行类型转换。
另外,Android 视图绑定库提供与“视图绑定文档(View Binding Documentation)”相同的体验,只是Activity/Fragment 中包含的代码少得多。该库目前仍在维护中,当前版本是 1.0.1,并且里面仍有一个待办列表,未来我会着手一一改进。
最后,欢迎大家的评论或建议。我会不断学习,不断分享。
原文作者:Yoga C. Pranata
原文链接:https://medium.com/easyread/how-to-simplify-your-android-view-binding-delegation-d07812b2a616