视图绑定演进
- findViewById ==》findViewByMe插件自动生成
ButterKnifeKotlin android extension- DataBinding(ViewBinding……)
一、findViewByTd
淘汰findViewById之前,我们先考虑:为什么用findViewById?findViewById有什么缺点?
一个简单的使用findViewById(用于初始化)的例子:
在java中,如果一个变量没有初始化就使用它,就会报NullPointerException(空指针异常)也就是说,如果将 button = findViewById(R.id.button); 注释掉,程序会闪退
当XML中有很多组件,每个组件都需要调用findViewById,太麻烦了,因此要用ViewBinding 对其进行简化
二、findViewByMe
1.引入插件
2.在xml文件中,单击右键找到findViewByMe插件
3.会发现已经帮我们写好了代码,我们只用复制粘贴既可以直接使用了
三、 ButterKnife 和 Kotlin Android Extensions
ButterKnife :早期很流行,现在已经不推荐使用
Kotlin Android Extensions:只能使用kotlin语言,不需要写任何代码,可以直接引用控件,但官方已经不再提倡
四、ViewBinding
在模块(所以是模块级的gradle文件)中启用ViewBinding后,它会为该模块中显示的每个 XML 布局文件生成一个绑定类。(若:activity_main.xml文件,则:绑定类名称ActivityMainBinding)
- 绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
- 每个绑定类还包含一个
getRoot()
方法,用于提供相应布局文件的根视图的直接引用。
(一)启动ViewBinding
注意Android Studio的版本: AS| Android Studio版本-CSDN博客
4.0之前(比较旧的版本了)
android {……
viewBinding{
enabled = true
}
4.0以后
//Groovy版:去掉等号
android {……
buildFeatures {
viewBinding = true
}
}
(二)使用ViewBinding
1.在Activity中使用,onCreate()
//调用生成绑定类的静态 inflate() 方法:创建该绑定类的实例以供 Activity 使用
binding = ActivityMainBinding.inflate(getLayoutInflater());
//获取对根视图的引用,将根视图传递给 setContentView(),使其成为屏幕上的活动视图
setContentView(binding.getRoot());
2.在Fragment中使用,onCreaView()
private ResultProfileBinding binding;
@Override
public View onCreateView (LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
binding = ResultProfileBinding.inflate(inflater, container, false);
View view = binding.getRoot();
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}