当前位置:   article > 正文

【Android】用 ViewBinding 让你的代码告别混乱_viewbinding 一键转换

viewbinding 一键转换

前言

当我们刚接触Android开发的时候,最常写的莫过于使用findViewById去在代码中找到并操作布局文件中的视图。然而,随着应用程序复杂性的增加,频繁使用 findViewById 可能导致代码冗长且容易出错。所以,我们的ViewBinding就登场了。

ViewBinding是什么

ViewBinding 是 Android 开发中的一种特性,它通过自动生成的绑定类使得开发者可以更方便地访问布局文件中的视图。使用 ViewBinding 可以避免在代码中使用 findViewById() 方法,从而减少了空指针异常(NullPointerException)和视图查找的复杂性。

ViewBinding的优势

首先我们来说一下findViewById的弊端:

  1. 类型不安全

    TextView textView = (TextView)findViewById(R.id.textView);
    
    • 1

    上述代码中,必须进行类型转换,如果不小心写错类型,会在运行时抛出异常。

  2. 空指针异常

    如果视图 ID 错误或者视图不存在,findViewById 会返回 null,这可能导致空指针异常。

  3. 代码冗长

    在复杂的布局中,频繁使用 findViewById 会使代码显得非常冗长和难以维护。

下来我们说一下ViewBinding 的优势:

ViewBinding 自动生成与布局文件对应的绑定类,避免了手动查找和转换视图的繁琐操作。

  1. 类型安全: 生成的绑定类具有类型安全性,不需要进行类型转换。

    binding.textView.setText("Hello, ViewBinding!");
    
    • 1
  2. 减少空指针异常

    通过直接访问绑定类中的视图,避免了因视图找不到而引发的空指针异常。

  3. 更简洁的代码

    不需要手动调用 findViewById,代码更加简洁和清晰。

如何使用ViewBinding

打开ViewBinding功能

要想使用 ViewBinding 需要我们先打开ViewBinding的功能

首先我们首先找到这个文件:

image-20240720094130370

在android目录下加入以下代码:

image-20240720094332854

添加后点击Sync Now进行同步工程

同步完成后表示已经可以使用ViewBinding了

生成绑定类

完成第一步后,一般会在文件中自动生成绑定类,如果没生成可以点击编译进行自动生成

生成后的绑定类位置如图所示:

image-20240720100025221

绑定类的命名规则

去掉下划线并将每个单词首字母大写(PascalCase):

  • 布局文件名:fragment_sample_list.xml activity_main.xml
  • 生成的绑定类名:FragmentSampleListBinding ActivityMainBinding

使用绑定类

假设我们有三个控件textViewbuttonbutton2,如果使用findViewById获取实例:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView text = (TextView) findViewById(R.id.showText);
        Button button1= (Button) findViewById(R.id.button1);
        Button button2= (Button) findViewById(R.id.button2);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

三个控件写三行比较少,但是如果是成百上千个控件,那么写起来可就需要费不少力了

如果使用ViewBinding:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        binding.showText.setText("xiaoduyyy");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

我们只需要获取一次实例就可以实现对所有控件的调用了

ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
  • 1

这句代码执行以下操作:

  1. 使用 inflate 方法inflate 方法是 ViewBinding 提供的一个静态方法,它用于将布局文件解析成对应的视图对象。getLayoutInflater() 用于获取一个 LayoutInflater 对象,该对象可以将 XML 布局文件转换成视图。
  2. 创建绑定对象: 通过 ActivityMainBinding.inflate(getLayoutInflater()),会创建一个 ActivityMainBinding 类型的绑定对象。这个对象包含了对 activity_main.xml 布局文件中所有视图的引用。
  3. 绑定布局: 绑定对象 binding 持有布局文件中的所有视图引用,可以通过这个对象直接访问和操作视图。

另外还要将

setContentView(R.layout.activity_main);
  • 1

改为

setContentView(binding.getRoot());
  • 1

就可以正常使用了

也可以将

ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
  • 1

放在最上面当全局变量供全局使用:

 private ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
  • 1

结语

通过使用 ViewBinding,我们可以显著简化视图查找的代码,使代码更加简洁和安全。无论是新项目还是旧项目的重构,ViewBinding 都是一个值得尝试的特性。告别 findViewById,让你的 Android 开发体验更加顺畅和高效。希望本文对大家有所帮助,如果存在问题请麻烦指正!!


已经到底啦!!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号