赞
踩
在Android开发中,控件的绑定是开发者无法绕开的一道程序。是Android开发中最原始,也是最基础的一种获取View的方法。在一个复杂布局的页面时,我们要一个个控件去调用findViewById方法去绑定,代码量会增多。那有什么方法能让我们findView更简单些呢,也让我们的代码能变得更加简洁,请往下看:
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的简单使用,要是有写得不对的地方,也很高兴大家多多指教。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。