Skip to content

han1202012/001_JetPack_ViewBinding

Repository files navigation

【JetPack 架构组件】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )

https://hanshuliang.blog.csdn.net/article/details/105044345



I . 视图绑定组件简介



Activity 获取布局组件方式 : 在之前的 Activity 代码中 , 使用 findViewById ( ) 方法 , 或者 Butter Knife 的 @BindView 注解方式获取 Layout 布局中的组件对象 ;


视图绑定 ( ViewBinding ) 是 Google 退出的新的获取布局组件的方式 , 顾名思义 , 其作用就是将 Layout 布局中的 View 组件绑定在 Activity 等界面的 Java / Kotlin 代码中 , 可以在代码中获取这些组件对象 ;



II . 视图绑定 ViewBinding 使用前提 ( Android Studio 3.6 )



1 . Android Studio 最低版本要求 : 使用视图绑定组件 , 需要将 Android Studio 开发环境升级到 3.6 Canary 11 及以上版本 ;


2 . 当前最新稳定版本 : 目前 2020/03/23 最新稳定版本是 3.6.1 , 建议升级到该版本 , 不推荐使用 4.0 或 4.1 BETA 版本 ;


估计大部分开发者都需要升级 Android Studio 版本到 3.6 以上 , 这里给简单的出升级流程 , 以作参考 ; ( 大概需要 10 分钟左右 )


3 . Android Studio 升级流程 : 尽量使用 Android Studio 自带的升级功能 , 这样能尽量少的降低对之前应用的影响 ;


① 选择 Android Studio 自带升级选项 : 选择菜单栏 , Help -> Check for Updates ... , 弹出下面的对话框 , 选择 Update and Restart 选项 ; 在这里插入图片描述


② 等待下载更新 : 等待下载 , 下载完毕后会自动安装应用 ;

在这里插入图片描述


③ 删除旧版本的相关目录 : 为了避免影响新版本 Android Studio 开发环境运行 , 删除旧版本的相关文件 ; 在这里插入图片描述


④ 新版本自动启动 :

在这里插入图片描述



III . 视图绑定组件启用



启用视图绑定模块 : 在 Module 中的 build.gradle 构建脚本中的 android 下 , 配置如下内容 :

viewBinding {
    enabled = true
}

在这里插入图片描述



IV . 定制视图绑定 ( 启用视图绑定后 不想生成绑定类 )



全部布局默认进行视图绑定 : 只要在 build.gradle 中启用了 视图绑定 , 那么系统会默认为每个 XML 布局文件生成一个绑定类 ;


定制不生成绑定类的情况 : 在布局根标签中配置 tools:viewBindingIgnore="true" 属性 , 即不为该布局生成绑定类 ; 在这里插入图片描述



V . 视图绑定布局文件



下面的绑定类定义了三个 TextView , 前两个定义了 id 分别是 text_view 和 text_view2 , 最后一个没有定义 id ;

该布局作为视图绑定的示例布局 , 下面的内容都以该布局为基础讲解 ;


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 1!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.3" />

    <TextView
        android:id="@+id/text_view2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 2!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.5"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 3!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.7"/>

</androidx.constraintlayout.widget.ConstraintLayout>


VI . 绑定类名称生成规则



视图绑定类名称生成规则 : 去掉布局文件名称的下划线 , 并以驼峰式命名 , 在名称结尾添加 Binding 后缀 ;


以本 Activity 的布局文件 activity_main.xml 为例 , 删除中间的下划线 , Activity 和 Main 首字母大写 , 在后面添加 Binding 后缀 , 生成的绑定类名称为 ActivityMainBinding ;



VII . 绑定类对应的布局中的组件字段生成规则



1 . 生成的绑定类字段 : 只要在布局文件中定义了 id 属性的组件 , 绑定类中就会为该组件生成相应的字段 ;


① 绑定类字段对应布局 ID : activity_main.xml 布局文件中 , 第一个和第二个 TextView 都定义了 id 分别是 text_view 和 text_view2 ;

② 绑定类生成的字段 : 那么系统会在 ActivityMainBinding 中生成 TextView text_view 和 TextView text_view2 两个字段 ;

③ 绑定类组件字段访问 : 通过 ActivityMainBinding 对象可以直接访问这两个组件 ;


2 . 不生成字段 : 第三个 TextView 没有定义 id 属性 , ActivityMainBinding 中不会生成该组件对应的字段 ;



VIII . 视图绑定类获取



activity_main.xml 布局生成的绑定类为 ActivityMainBinding , 可调用 inflate 方法 , 获取该绑定类对象 , 需要传递 LayoutInflater 参数 , 可以直接调用 Activity 的 getLayoutInflater() 方法获取 ;


/**
 * 视图绑定类 对象
 *      binding 中可以获取布局文件中定义的
 *      text_view 和 text_view2 两个 TextView 组
 *
 */
private ActivityMainBinding binding;


/*
    获取 视图绑定 对象
    生成绑定类 : 需要传递 LayoutInflater 参数 ,
        可以直接调用 Activity 的 getLayoutInflater() 方法获取
 */
binding = ActivityMainBinding.inflate(getLayoutInflater());


IX . 设置视图绑定后的布局



1 . 获取根视图 : ActivityMainBinding 绑定类自带 getRoot() 方法 , 可以直接获取到 布局文件的 根视图 ;

2 . 设置 Activity 视图 : 这里可以直接将根视图传递给 setContentView 函数作为参数 , 即可在该 Activity 中显示该布局 ;


/*
    ActivityMainBinding 绑定类自带 getRoot() 方法
        可以直接获取到 布局文件的 根视图
    这里可以直接将根视图传递给 setContentView 函数作为参数 , 即可在该 Activity 中显示该布局
 */
setContentView(binding.getRoot());


X . 获取视图绑定类组件



可以直接通过 视图绑定类 ActivityMainBinding 对象 binding 获取对应的组件 , 组件名称就是布局文件中定义的组件 id ;

//binding 中可以直接通过组件 id 获取对应的组件
binding.textView.setText("ActivityMainBinding 1");
binding.textView2.setText("ActivityMainBinding 2");


XI . 视图绑定对应 Java 示例代码



package kim.hsl.vb;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import kim.hsl.vb.databinding.ActivityMainBinding;

/**
 *
 * 视图绑定 ( ViewBinding ) 只绑定布局文件中定义了 id 属性的组件
 *      那些没有定义 id 属性的组件不绑定
 *
 *  只要在 build.gradle 中启用了 视图绑定 ,
 *      那么系统会默认为每个 XML 布局文件生成一个绑定类 ;
 *      ( 可以在布局中设置 tools:viewBindingIgnore="true" 不生成绑定类 )
 *
 *
 *  视图绑定类生成规则 : 去掉布局文件名称的下划线 , 并以驼峰式命名 , 在名称结尾添加 Binding 后缀 ;
 *      以本 Activity 的布局文件 activity_main.xml 为例 :
 *          删除中间的下划线 , Activity 和 Main 首字母大写 , 在后面添加 Binding 后缀
 *          生成的绑定类名称为 ActivityMainBinding
 *
 *   生成的绑定类字段 : 只要在布局文件中定义了 id 属性的组件 , 绑定类中就会为该组件生成相应的字段
 *      如 :
 *
 *      生成字段 : activity_main.xml 布局文件中 , 第一个和第二个 TextView 都定义了 id 分别是
 *      text_view 和 text_view2 ,
 *      那么系统会在 ActivityMainBinding 中生成 TextView text_view 和 TextView text_view2 两个字段
 *      通过 ActivityMainBinding 对象可以直接访问这两个组件
 *
 *      不生成字段 : 第三个 TextView 没有定义 id 属性 , ActivityMainBinding 中不会生成该组件对应的字段
 *
 *
 *  不生成绑定类的情况 : 在布局根标签中配置 tools:viewBindingIgnore="true" 属性 , 即不为该布局生成绑定类
 *
 *
 *   视图绑定 与 findViewById 对比 : 避免了很多问题出现 ;
 *      空指针优化 : 视图绑定 针对一个布局进行自动生成字段 , 不会出现 ID 无效导致的空指针情况 ;
 *      类型安全优化 : 视图绑定 的类型都是自动生成好的 , 不会出现用户自己定义类型 , 导致组件类型转换错误的情况 ;
 *
 */
public class MainActivity extends AppCompatActivity {

    /**
     * 视图绑定类 对象
     *      binding 中可以获取布局文件中定义的
     *      text_view 和 text_view2 两个 TextView 组件
     *
     */
    private ActivityMainBinding binding;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /*
            获取 视图绑定 对象

            生成绑定类 : 需要传递 LayoutInflater 参数 ,
                可以直接调用 Activity 的 getLayoutInflater() 方法获取
         */
        binding = ActivityMainBinding.inflate(getLayoutInflater());

        /*
            ActivityMainBinding 绑定类自带 getRoot() 方法
                可以直接获取到 布局文件的 根视图

            这里可以直接将根视图传递给 setContentView 函数作为参数 , 即可在该 Activity 中显示该布局
         */
        setContentView(binding.getRoot());

        //binding 中可以直接通过组件 id 获取对应的组件
        binding.textView.setText("ActivityMainBinding 1");
        binding.textView2.setText("ActivityMainBinding 2");
    }
}


XII . 应用运行结果



APP 运行结果 : 可以看到通过绑定类获取 TextView , 设置其文字 , 分别为 ActivityMainBinding 1 和 ActivityMainBinding 2 已经设置成功 , 说明视图绑定操作完成 ;

在这里插入图片描述



XIII . GitHub 代码地址



GitHub 代码地址 : https://github.com/han1202012/001_JetPack_ViewBinding

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published