● What
通过视图绑定,可以更好的编写与视图进行交互的代码。在模块中启用视图绑定以后,系统会为模块中的每一个布局资源文件生成对应的绑定类,类名是布局资源文件名的驼峰大小写,并在末尾添加Binding,比如一个布局文件名是main_activity.xml,那么生成的绑定类叫做MainActivityBinding。通过这个类的实例,可以获得根视图和具有id属性的控件的引用,从而对视图进行相应的操作。
● How
首先需要在对应的模块下的build.gradle文件中添加如下声明,sync以后就启用视图绑定了。
viewBinding {
enabled = true
}
在Activity中的onCreate()方法中调用布局绑定类的inflate()方法的到布局绑定类的实例,然后根据这个实例使用getRoot()方法得到根布局,然后使用setContentView()方法将根视图设置为活动视图,根据子view的id得到对应的view的引用。
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding mActivityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());//获得布局绑定类的实例
LinearLayout linearLayout = mActivityMainBinding.getRoot();//根视图的引用
mActivityMainBinding.name.setText("Tom");//操作子view
mActivityMainBinding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
}
});
setContentView(linearLayout);//将根视图设置为活动视图
}
}
如果是在Fragment中使用视图绑定,首先调用生成的绑定类的静态方法inflate()创建绑定类的实例,然后通过getRoot()方法得到根视图,返回根视图使其成为活动视图。
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
mFragmentFirstBinding = FragmentFirstBinding.inflate(inflater,container,false);
LinearLayout linearLayout = mFragmentFirstBinding.getRoot();
TextView textView = mFragmentFirstBinding.firstTextView;
textView.setText("Fragment");
return linearLayout;
}
Why not findViewById()
由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable标记;每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。这些差异意味着布局和代码之间的不兼容将会导致构建在编译时(而非运行时)失败。
网友评论