Android视图绑定是什么?怎样简化其授权?


1_QFMxEQhfwqq_GM9WrlG8wg

在Google IO / 19的Android Talk上发布的视图绑定,属于Android Jetpack中的部分功能。接下来我们可以对其进行进一步的了解。

什么是视图绑定

正如他们在如开发者页面上所说,

通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。模块中的视图绑定一旦启动,系统会为该模块中所呈现的每个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。使用视图绑定的其他优点是:
类型安全:视图绑定提供了与XML布局中定义的类型相同的生成方法。因此不需
要再进行类转换。
Null安全:findViewById并不是空安全的。如果你使用的是Kotlin,它将省去检查
所有null变量的麻烦。而如果换做Java用户,它会让这些用户大发雷霆:D

如何使用视图绑定

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的委托属性与其扩展函数共同创建的。因此,在您的视图中就不需要视图绑定授权的样板文件了。在这里查看此库。

添加依赖项:

将此添加到您的build.gradle中:

allprojects {
   repositories {
      ...
      maven { url 'https://jitpack.io' }
   }
}

在app / build.gradle中启用viewbinding:

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()
MainActivity类:AppCompatActivity(){

  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 ViewBinding库将为您提供与“视图绑定文档”中相同的体验,但要比Activity/Fragment包含的代码要少得多。该库目前仍在维护中。当前,版本是1.0.1,并且里面仍有一个待办列表。未来我会着手一一改进。

最后,欢迎您一如既往地发表评论或建议。不断学习,不断分享。

作者 Yoga C. Pranata

原文链接 How to Simplify your Android View Binding Delegation