「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
ButterKnife 黄色警告
前言
在很久以前,大家通过view id 获取到组件的实例,大家都用findById方法,刚开始的时候还要加上类型转换,如(TextView)findById(R.id.tv),后来强制转换去掉了,直接findById(R.id.tv)就可以了,某些程序员为了让广大程序员偷懒,AS插件和注解工具应运而生,其中最著名的就是ButterKnife(黄油刀),用了这么多年一直很爽。 当某天安卓开发工具的版本升级到了北极狐之后,所有关于ButterKnife的开始黄色警告...
ButterKnife官方这么说
注意:此工具现已弃用。请切换到 查看绑定。显然,现有版本将继续工作,但只会考虑与 AGP 集成的关键错误修复。功能开发和一般错误修复已停止。
可见ButterKnife 已经停止维护了,并推荐了安卓官方的 视图绑定
视图绑定是什么
就是为了绑定和组件的关系,代替原来的findViewById,据说内部实现还是使用findViewById
AS是否支持视图绑定
视图绑定在 Android Studio 3.6 Canary 11 及更高版本中可用。
那么北极狐算啥版本?
这是因为官方更新了 Android Studio 的版本号,原因是为了和Intellij版本对应。
北极狐是肯定支持视图绑定了。
开始视图绑定
无论是否使用AndroidX,视图绑定都可以使用。
- 启动视图绑定
在app的build文件下
android {
...
viewBinding {
enabled = true
}
}
}
- 布局文件声明组件id
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
- 在Activity中添加绑定操作
private ActivityMainBinding mActivityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivityMainBinding = ActivityMainBinding.inflate(LayoutInflater.from(this));
setContentView(mActivityMainBinding.getRoot());
}
注意一定要改变原始的setContentView,将该方法的参数设置成mActivityMainBinding.getRoot(),否则操作不了组件。
- 动态操作组件
使用 binding.id名称 进行操作,和以前的方法一样进行操作它。
因为在使用视图绑定之后,在app/build/generated/ 文件夹下会生成关于组件的常量,可以看到内部也是使用findViewById实现的。
mActivityMainBinding.text.setText("测试");
mActivityMainBinding.image.setImageResource(R.mipmap.ic_launcher);
mActivityMainBinding.btn.setText("test");
mActivityMainBinding.btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
- 指定不生成Binding文件
有些布局文件我们不想生成Binding文件,我们就在layout文件中进行设置。在layout的根目录组件下
tools:viewBindingIgnore="true"