Android的控件绑定----ViewBinding

在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直接使用这个控件了。

Android的控件绑定----ViewBinding_第1张图片

我们可以看看系统自动生成的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类,这个时候我们就可以在这个布局文件的根元素位置加入如下声明:

Android的控件绑定----ViewBinding_第2张图片

以上就是ViewBinding的简单使用,要是有写得不对的地方,也很高兴大家多多指教。

你可能感兴趣的:(android,android,tv,kotlin)