文章目录

  • I . 为现有项目配置 视图绑定 ( ViewBinding ) 应用
  • II . 视图绑定 ( ViewBinding ) 定制
  • III . 视图绑定 ( ViewBinding ) 对于正常操作的影响测试
  • IV . 视图绑定 ( ViewBinding ) 关联 Activity 界面
  • V . 视图绑定 ( ViewBinding ) 本质分析
  • VI . GitHub 代码地址

I . 为现有项目配置 视图绑定 ( ViewBinding ) 应用


1 . 视图绑定模块默认为全部布局生成绑定类 ; 视图绑定 ( ViewBinding ) 模块一旦启用 , 应用的全部布局都会默认自动生成一个视图绑定类 , 如果生成了视图绑定模块 , 是否对于已经使用的 findViewById 或者 @BindView @BindViews 代码是否有影响 ;

2 . Android 项目中布局文件数量比较大 ; 现在的 Android 项目如果比较大 , 布局文件可能存在上百个 , Activity , Fragment , 自定义布局的 Dialog , 自定义 View 组件 , RecyclerView 列表条目 item 布局 , 这些都要使用到布局文件 ;

3 . 如果为该 Android 项目启用了视图绑定模块 , 所有的布局都会生成对应的视图绑定类 ;

4 . 因此这里需要讨论如下问题 : 如果在 build.gradle 中启用了视图绑定模块 , 对已经开发好的代码是否有影响 , 本博客会进行详细的测试 ;

5 . 先说下结论 : 视图绑定 只是为我们额外生成了一种新的操作布局和组件的方式 , 不会对之前已经写好的代码产生影响 ;

II . 视图绑定 ( ViewBinding ) 定制


1 . Android 官方文档中给出的定制方案 : 如果当前有几百个布局文件 , 为了不影响之前的代码 , 可以在每个布局的根视图上配置 tools:viewBindingIgnore=“true” 属性 ; ( 工作量较大 )

2 . 不影响之前的代码 : 此时可以不进行上面的操作 , 虽然启用了视图绑定模块 , 系统为我们生成了视图绑定类 , 这个类我们可以选择使用 , 也可以选择不用 , 也可以继续使用 setContentView(R.layout.activity_main) 设置布局文件 , 使用 findViewById(R.id.text_view) 获取组件 ; 可以不使用系统给生成的绑定类 XxxXxxBinding ;

III . 视图绑定 ( ViewBinding ) 对于正常操作的影响测试


1 . 先说下结论 : 视图绑定 只是为我们额外生成了一种新的操作布局和组件的方式 , 不会对之前已经写好的代码产生影响 ;

2 . 在启用了 ViewBinding 模块后 , 布局中如果没有屏蔽视图绑定 , 那么会为该布局生成布局绑定类 , 此时如果进行正常的操作 , 仍然不影响 , 可以不用修改之前的代码 ;

3 . 在 build,gradle 中配置了视图绑定 : 主要是 viewBinding 配置 , 其它都是多余的 ;

apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "kim.hsl.vb"minSdkVersion 16targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}viewBinding {//启用视图绑定模块enabled = true}}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

4 . 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"><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

5 . Activity 界面的 Java 代码 : 仍然使用传统的布局操作方式 , 使用 setContentView(R.layout.activity_main) 设置布局文件 , 使用 findViewById(R.id.text_view) 获取组件 ;

package kim.hsl.vb;import androidx.appcompat.app.AppCompatActivity;import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.TextView;import kim.hsl.vb.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {/*** 从布局中获取 TextView 组件*/private TextView text_view;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// I . 传统使用方式//设置布局文件setContentView(R.layout.activity_main);//获取布局文件中的 id 为 text_view 的 TextView 组件text_view = findViewById(R.id.text_view);text_view.setText("启用视图绑定的情况下使用传统布局操作方法");// II . 视图绑定类分析//  下面的视图绑定类操作是无效的//获取视图绑定类 , 但是此视图绑定类没有关联该界面//  关联的方式是 setContentView 中设置该绑定类的根视图才可以ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());//由于视图绑定类中的视图并未与该 Activity 界面关联//  因此单纯的操作该视图绑定类不能修改本界面的 TextView 显示文字binding.textView.setText("ActivityMainBinding");}
}

6 . 执行结果 :

IV . 视图绑定 ( ViewBinding ) 关联 Activity 界面


1 . 两种获取组件方式 : 上面的示例代码中 , 分别使用 findViewById(R.id.text_view) 获取的组件 和 ActivityMainBinding 获取组件 ; 但是使用 ActivityMainBinding 获取组件无法修改界面 ;

2 . ActivityMainBinding 获取的组件无法控制界面 , 这是因为该 ActivityMainBinding 视图绑定类 , 并没有与 Activity 关联 ;

3 . 界面布局分析 : 设置界面布局的代码是 setContentView(R.layout.activity_main) , 此处将 activity_main.xml 布局设置给了 Activity 显示 , 该布局的视图组件与 ActivityMainBinding 没有任何关联 , Activity 显示的组件也不是 ActivityMainBinding 绑定类中的组件 , 因此操作视图绑定类中的组件不能修改 Activity 界面的显示 ;

4 . 如果要显示需要将 ActivityMainBinding 根视图设置给 Activity 显示 , 进行如下操作 ;

/*获取 视图绑定 对象生成绑定类 : 需要传递 LayoutInflater 参数 ,可以直接调用 Activity 的 getLayoutInflater() 方法获取*/
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
/*ActivityMainBinding 绑定类自带 getRoot() 方法可以直接获取到 布局文件的 根视图这里可以直接将根视图传递给 setContentView 函数作为参数 , 即可在该 Activity 中显示该布局*/
setContentView(binding.getRoot());

5 . 关联界面操作 : setContentView(binding.getRoot()) 操作就是将视图绑定类与 Activity 界面关联了起来 , 此时操作视图绑定类就可以修改界面内容了 ;

V . 视图绑定 ( ViewBinding ) 本质分析


视图绑定 ( ViewBinding ) 其本质就是提供了一种加载布局文件的便捷方式 , 与下面的操作本质是类似的 , 只是可以省略很多代码 ;

① 布局加载操作 :

//加载布局文件
View view = LayoutInflater.from(context).inflate(R.layout.activity_main, parent, false);//查找布局文件中的组件
TextView textView = view.findViewById(R.id.text_view);

② 视图绑定操作 :

ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
TextView textView = binding.textView;

VI . GitHub 代码地址


GitHub 代码地址 : https://github.com/han1202012/002_JetPack_ViewBinding_Apply

【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )相关推荐

  1. 【Android工具类】Activity管理工具类AppManager

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 import java.util.Stack;import android.app.Activity; im ...

  2. 将现有android项目打包成aar包供第三方应用调用

    1.打包之后生成的文件地址: *.jar:库/build/intermediates/bundles/debug(release)/classes.jar *.aar:库/build/outputs/ ...

  3. sonar扫描android项目配置 mac版

    一.安装sonar扫描工具 1. 下载sonarqube,并解压 2. 下载sonar scanner,并解压 3. 进入sonarube的conf文件夹下,修改sonar.properties文件 ...

  4. Android项目CJM9之新闻浏览模块的实现

    今天看cjm9的代码时候想把模块梳理一下,顺便再熟悉下mvp,rxjava和retrofit的综合运用.我们先看图 新闻item的具体信息 图片item的具体信息 大概就是上面那样. 下面开始代码分析 ...

  5. Android项目分包(按功能模块)

    分包是一个开放性的问题,它并没有固定或最优的方案,但是不好的分包策略带来的影响将会一直持续在App的开发迭代周期中,给开发带来一定的麻烦:如:耦合性 ,不易维护,重用难度高 下面介绍一下一种分包策略( ...

  6. Android项目小结——可对焦的视频录制(MediaRecorder与TextureView实现)

    一直在做安卓的项目,想着找个时间总结一下,可能太懒了,一直没总结. 代码(尤其是对焦框显示)参考了许多Blog和Github,修修补补改改挺多地方,记录一下,侵删私信或注明出处. 录制 主要的类 Ca ...

  7. Android项目开发实战常用知识点

    Android项目开发实战常用知识点 一:启动页延时两秒再跳转到主界面: //执行类 private class SlpashRunnable implements Runnable {@Overri ...

  8. Android 项目开发填坑记 - 使用 MultiDex 解决 64K 限制

    如果移动端访问不佳,请访问 –> Github版 背景 Android 的 classLoader 在加载 APK 的时候限制了class.dex 包含的 Java 方法数,其总数不能超过655 ...

  9. XamarinSQLite教程Xamarin.Android项目添加引用

    XamarinSQLite教程Xamarin.Android项目添加引用 在Xamarin.Android项目中,导入System.Data和Mono.Data.SQLite库的操作步骤如下: (1) ...

最新文章

  1. Failed to load AppCompat ActionBar with unknown error
  2. linux进程状态d状态,Linux下进程的状态
  3. 科大讯飞年报出炉,2018每天赚148万元,53%是政府补助
  4. BZOJ1084 SCOI2005最大子矩阵
  5. 漫游Kafka入门篇之简单介绍
  6. python数据分享人力资源_Python数据分析帮你清晰的了解整理员工们的工作效率和整体满意度...
  7. 『重构--改善既有代码的设计』读书笔记----Split Temporary Variable
  8. Twisted中的putChild和getChild
  9. 【MySQL】MySQL STRAIGHT JOIN 使用案例以及简介
  10. Nginx/Apache/Tomcat记录屏蔽真实IP
  11. docker没有下载完全_一个时代的结束:苹果正式关闭iTunes,但歌曲下载并没有完全消失...
  12. 网络七层,五层,四层模型,数据封装、解封装,进制转换。
  13. openai-gpt_GPT-3 101:简介
  14. mysql常用语句之DQL:查询语句
  15. 【机房报修管理系统】后端篇(一) 设计数据表
  16. 整理了上千个 Python 工具库,涵盖24个大方向
  17. Java多维数组length
  18. APP STORE又崩了?可以通过DNS解决!
  19. latex 中表格怎么指定编号_科学网—latex中简单表格制作+标题+编号+固定位置 - 江亿平的博文...
  20. jvm调优【减少GC频率和Full GC次数】中Gc是什么

热门文章

  1. 在Struts 2中实现文件上传
  2. Codeforces 920D Tanks (看题解)
  3. Ajax+Python flask实现上传文件功能
  4. 【面向对象设计与构造】第一次博客作业
  5. Microsoft SQL Server学习(二)--数据库的语法
  6. MAX2323E - 原理图系列
  7. http://www.himigame.com/mac-cocoa-application/893.html
  8. prism4.0——chapter 2:初始化Prism应用
  9. Windows Server 2008常用优化设置
  10. python3多线程第三方库_Python之多线程爬虫抓取网页图片的示例代码