在Android开发中,控件的绑定是开发者无法绕开的一道程序。是Android开发中最原始,也是最基础的一种获取View的方法。在一个复杂布局的页面时,我们要一个个控件去调用findViewById方法去绑定,代码量会增多。那有什么方法能让我们findView更简单些呢,也让我们的代码能变得更加简洁,请往下看:
·ViewBinding
ViewBinding是Google在2019年I/O大会上公布的一款Android视图绑定工具,也是Google强烈推荐我们使用的。
原理:Google在Android gradle插件中增加了新功能,当某个module开启ViewBind功能后,编译的时候就去扫描此模块下的layout文件,生成对应的binding类,findViewById操作就是在这个自动生成的类里面完成的。
如何使用:
第一步:确保你的Android Studio是3.6或更高的版本,在对应的项目工程模块的 build.gradle加入以下配置:
android {
...
buildFeatures{
viewBinding= true
}
}
设置好后Android Studio会自动为我们所编写的每一个布局文件都生成一个对应的Binding类。
第二步:在控件绑定的地方(如:Activity里),布局文件名称是:activity_main,则系统会自动生成一个ActivityMainBinding的类,通过这个类,我们就可以直接使用布局文件里的控件了,而不用通过一个个去通过findViewById绑定后再使用,如代码中的button1,我们直接通过实例化ActivityMainBinding一个对象binding后,就可以通过binding.button1直接使用这个控件了。
我们可以看看系统自动生成的ActivityMainBinding里面到底做了什么,如下代码:
// Generated by view binder compiler. Do not edit!
package com.example.kotlinexample.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
import com.example.kotlinexample.R;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final LinearLayout rootView;
@NonNull
public final Button button1;
private ActivityMainBinding(@NonNull LinearLayout rootView, @NonNull Button button1) {
this.rootView = rootView;
this.button1 = button1;
}
@Override
@NonNull
public LinearLayout getRoot() {
return rootView;
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
//这里把布局文件加载进来了
View root = inflater.inflate(R.layout.activity_main, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static ActivityMainBinding bind(@NonNull View rootView) {
// The body of this method is generated in a way you would not otherwise write.
// This is done to optimize the compiled bytecode for size and performance.
int id;
missingId: {
id = R.id.button1;
//这里加载控件
Button button1 = rootView.findViewById(id);
if (button1 == null) {
break missingId;
}
return new ActivityMainBinding((LinearLayout) rootView, button1);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
}
可以看到,ActivityMainBinding这个类其实也是通过findViewById加载控件的,只是它在内部已经帮我们加载好了,我们直接调用就可以了
注意!!!有时候我们可能不想某些布局文件生成它对应的Binding类,这个时候我们就可以在这个布局文件的根元素位置加入如下声明:
以上就是ViewBinding的简单使用