如何在Android中使用视图绑定

118 阅读4分钟

如何在Android中使用视图绑定

视图绑定允许开发者在一个应用程序中加入重要的交互。这个概念旨在消除findViewById关键字。去除这样的模板代码可以让开发者更有生产力。

当使用视图绑定时,通常会为每个布局文件生成一个绑定类。绑定类存储所有对特定视图的引用。

生成的绑定类与layout.xml 文件的名称几乎相似。例如,detail_main.xml 的绑定类名称是DetailMainBinding 。这种命名技术有助于避免混淆和错误。

视图绑定是无效安全的,而且速度很快。它允许开发者在编程过程中避免常见的错误。

目标

本教程将帮助你理解Android中使用Kotlin的视图绑定概念。

前提条件

要继续学习,你应该具备以下条件

  • 对Kotlin编程语言有基本了解。
  • 在你的电脑上安装了[Android Studio]。

视图绑定的优势

视图绑定有几个优点。首先,它支持空安全。这个功能可以防止开发者调用不存在的视图或ID。因此,它可以防止应用程序的突然崩溃。

其次,视图绑定有助于减少模板代码。在过去,开发人员不得不大量使用findViewById 关键字。因此,在这些操作上浪费了大量的时间。视图绑定试图消除这种挑战。

视图绑定也促进了类型安全。生成的绑定类与布局文件中声明的视图相匹配。再一次,这个功能可以防止应用程序崩溃。

第1步 - 创建项目

启动Android Studio并创建一个新的空项目。注意,这个过程可能需要一些时间,这取决于你的计算机的属性。

Empty Project

第2步 - 添加所需的依赖性

项目生成后,导航到应用级build.gradle 文件并添加以下代码。

buildFeatures{
        viewBinding true
    }

然后点击sync now 按钮来更新项目。

第3步 - 准备用户界面

让我们在activity_main.xml 文件中声明几个按钮和TextViews ,如下图所示。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/welcome"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_margin="20dp"
        android:layout_gravity="center"/>

    <TextView
        android:id="@+id/login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Login"
        android:layout_margin="20dp"
        android:layout_gravity="center"/>

    <Button
        android:id="@+id/send_data"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send data"
        android:layout_margin="20dp"
        android:backgroundTint="@color/colorAccent"
        android:layout_gravity="center"/>/>

</LinearLayout>

第4步 - 访问用户界面组件

在这一步,我们需要访问我们在activity_main.xml 文件中定义的UI组件。我们将在MainActivity 中定义并初始化绑定类。

打开MainActivity 文件并纳入以下修改。

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding  //defining the binding class

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater) //initializing the binding class
        setContentView(binding.root) // we now set the contentview as the binding.root

        binding.welcome.text = "Hallo and welcome"
    }
}

在上面的代码中,我们可以用binding.welcome ,而不是findViewById 来引用TextView.text 方面允许我们改变TextView的内容。

为了访问我们之前定义的send_data 按钮,我们使用下面的代码。

binding.send_Data.setOnClickListener{
    //perform an operation
    //send_Data is the button's id
}

第5步 - 在片段中使用视图绑定

片段是许多应用程序的常见组件。由于其生命周期回调和行为,开发者更喜欢片段。片段也可以很容易地从活动中添加和删除。

在片段中加入视图绑定可以带来更好的用户体验。

为了简单起见,让我们创建一个新的Android项目。这一次我们将选择Fragment + ViewModel 作为默认模板。

Fragment

像往常一样,我们需要在应用级build.gradle 文件中允许视图绑定。

     buildFeatures{
        viewBinding true
    }

让我们在片段中添加以下UI组件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ui.main.MainFragment">

    <!-- The fragments have the following TextViews -->

    <TextView
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MainFragment"/>

    <TextView
        android:id="@+id/content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hallo there. This is a fragment"/>

</LinearLayout>

始终确保所需的UI元素有一个ID。

当我们导航到MainFragment.kt 文件时,你会看到下面的代码。

class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View {
        return inflater.inflate(R.layout.main_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        // TODO: Use the ViewModel
    }

}

我们需要对上面的代码做几个修改。首先,我们必须定义并初始化绑定类。我们还应该用生成的绑定类替换return inflater.inflate(R.layout.main_fragment, container, false)

首先,让我们创建一个新的绑定变量并将其设置为null,如下图所示。

private var fragbinding = MainFragmentBinding? = null

其次,我们需要用下面的代码片断来替换return inflater.inflate(R.layout.main_fragment, container, false)

fragbinding = MainFragmentBinding.inflate(inflater, container, false)
return fragbinding.root

然后我们将从绑定中返回根类,如上所示。

下面是MainFragment 的完整代码。

class MainFragment : Fragment() {

    companion object {
        fun newInstance() = MainFragment()
    }

    private lateinit var viewModel: MainViewModel
    private var fragbinding = MainFragmentBinding? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View {
        fragbinding = MainFragmentBinding.inflate(inflater, container, false)
        return fragbinding.root
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
        // TODO: Use the ViewModel

        //we can access our UI components, as shown below
        fragbinding.message.text = "Hello there"
        fragbinding.content.text = "This is an example of view binding in Android"
    }

}

结语

在本教程中,我们已经学会了如何在活动和片段中使用视图绑定。视图绑定功能的巨大优势在于它节省了大量的时间,同时也消除了模板代码。

你可以利用从本课程中获得的知识来制作漂亮而高质量的应用程序。