【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )
文章目录
- I . 视图绑定组件简介
- II . 视图绑定 ViewBinding 使用前提 ( Android Studio 3.6 )
- III . 视图绑定组件启用
- IV . 定制视图绑定 ( 启用视图绑定后 不想生成绑定类 )
- V . 视图绑定布局文件
- VI . 绑定类名称生成规则
- VII . 绑定类对应的布局中的组件字段生成规则
- VIII . 视图绑定类获取
- IX . 设置视图绑定后的布局
- X . 获取视图绑定类组件
- XI . 视图绑定对应 Java 示例代码
- XII . 应用运行结果
- XIII . GitHub 代码地址
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.ConstraintLayoutxmlns: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"><TextViewandroid: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" /><TextViewandroid: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"/><TextViewandroid: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 是 text_view , 生成的成员变量名称是 textView ;
1 . 生成的绑定类字段 : 只要在布局文件中定义了 id 属性的组件 , 绑定类中就会为该组件生成相应的字段 ;
① 绑定类字段对应布局 ID : activity_main.xml 布局文件中 , 第一个和第二个 TextView 都定义了 id 分别是 text_view 和 text_view2 ;
② 绑定类生成的字段 : 那么系统会在 ActivityMainBinding 中生成 TextView textView 和 TextView textView2 两个字段 ;
③ 绑定类组件字段访问 : 通过 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;@Overrideprotected 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
总结
以上是生活随笔为你收集整理的【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【Kotlin】Kotlin enum
- 下一篇: 【JetPack】视图绑定 ( View