赞
踩
当我们刚接触Android开发的时候,最常写的莫过于使用findViewById
去在代码中找到并操作布局文件中的视图。然而,随着应用程序复杂性的增加,频繁使用 findViewById
可能导致代码冗长且容易出错。所以,我们的ViewBinding就登场了。
ViewBinding 是 Android 开发中的一种特性,它通过自动生成的绑定类使得开发者可以更方便地访问布局文件中的视图。使用 ViewBinding 可以避免在代码中使用 findViewById()
方法,从而减少了空指针异常(NullPointerException)和视图查找的复杂性。
首先我们来说一下findViewById
的弊端:
类型不安全:
TextView textView = (TextView)findViewById(R.id.textView);
上述代码中,必须进行类型转换,如果不小心写错类型,会在运行时抛出异常。
空指针异常:
如果视图 ID 错误或者视图不存在,findViewById
会返回 null
,这可能导致空指针异常。
代码冗长:
在复杂的布局中,频繁使用 findViewById
会使代码显得非常冗长和难以维护。
下来我们说一下ViewBinding 的优势:
ViewBinding 自动生成与布局文件对应的绑定类,避免了手动查找和转换视图的繁琐操作。
类型安全: 生成的绑定类具有类型安全性,不需要进行类型转换。
binding.textView.setText("Hello, ViewBinding!");
减少空指针异常:
通过直接访问绑定类中的视图,避免了因视图找不到而引发的空指针异常。
更简洁的代码:
不需要手动调用 findViewById
,代码更加简洁和清晰。
要想使用 ViewBinding 需要我们先打开ViewBinding的功能
首先我们首先找到这个文件:
在android目录下加入以下代码:
添加后点击Sync Now
进行同步工程
同步完成后表示已经可以使用ViewBinding了
完成第一步后,一般会在文件中自动生成绑定类,如果没生成可以点击编译进行自动生成
生成后的绑定类位置如图所示:
绑定类的命名规则:
去掉下划线并将每个单词首字母大写(PascalCase):
假设我们有三个控件textView
,button
和button2
,如果使用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);
}
}
三个控件写三行比较少,但是如果是成百上千个控件,那么写起来可就需要费不少力了
如果使用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");
}
}
我们只需要获取一次实例就可以实现对所有控件的调用了
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
- 1
这句代码执行以下操作:
- 使用
inflate
方法:inflate
方法是 ViewBinding 提供的一个静态方法,它用于将布局文件解析成对应的视图对象。getLayoutInflater()
用于获取一个LayoutInflater
对象,该对象可以将 XML 布局文件转换成视图。- 创建绑定对象: 通过
ActivityMainBinding.inflate(getLayoutInflater())
,会创建一个ActivityMainBinding
类型的绑定对象。这个对象包含了对activity_main.xml
布局文件中所有视图的引用。- 绑定布局: 绑定对象
binding
持有布局文件中的所有视图引用,可以通过这个对象直接访问和操作视图。
另外还要将
setContentView(R.layout.activity_main);
改为
setContentView(binding.getRoot());
就可以正常使用了
也可以将
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
放在最上面当全局变量供全局使用:
private ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
通过使用 ViewBinding,我们可以显著简化视图查找的代码,使代码更加简洁和安全。无论是新项目还是旧项目的重构,ViewBinding 都是一个值得尝试的特性。告别 findViewById
,让你的 Android 开发体验更加顺畅和高效。希望本文对大家有所帮助,如果存在问题请麻烦指正!!
已经到底啦!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。