如何简化 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 SafetyfindViewById 并不是 null safe 的。如果开发者使用的是 Kotlin,可以不用检查所有 null 变量,但如果使用 Java,就会非常抓狂 :exploding_head:

如何使用视图绑定?

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

注册登录 后评论
    // 作者
    声网技术社区 发布于 声网开发者社区
    • 0
    // 本帖子
    // 相关帖子
    Coming soon...
    • 0
    如何简化 Android 视图绑定授权声网技术社区 发布于 声网开发者社区