介绍

ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。

GitHub地址:https://github.com/JakeWharton/butterknife

原理

利用了IOC的(Inverse of Controll)控制反转结构,2004年后改名为DI(dependency injection)依赖注入。目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性。越来越趋向于后端开发了。

配置

在Android Studio项目中配置使用ButterKnife
本文介绍使用的as版本为3.1.2,ButterKnife版本为8.8.1
1.如果你是直接在app中使用,只需在app的 build.gradle 中添加如下代码:

dependencies {implementation 'com.jakewharton:butterknife:8.8.1'annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

2.如果你是在Library库中使用,按照github上的配置来写,会报错。

Unable to find method 'com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;'.
Possible causes for this unexpected error include:<ul><li>Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)</li><li>The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
Stop Gradle build processes (requires restart)</li><li>Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.</li></ul>In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

在网上找到了大神的解决办法解决组件化开发butterknife 在 library中使用的坑
第一步
配置项目根目录的build.gradle

这里注意butterknife的版本,我从8.8.1一直往下降,到了8.5.1才可以使用

第二步
配置library中的build.gradle
顶部添加插件apply plugin: ‘com.jakewharton.butterknife’

在dependencies中添加和在app中的一样

到此配置已完成,下面说下在library中使用时注意事项

1.用R2代替R,这点butterknife的开发者也做了说明

@BindView(R2.id.test_tv)
TextView tv;
@BindView(R2.id.test_btn)
Button btn;

2.onclick事件,在library中不能用switch,如果使用,点击事件会失效,用if和else代替。还要注意id的使用

安装插件


安装后重启生效
使用时,右键layout->点击Generate->Generate ButterKnife Injections

注解使用用例

绑定id:BindView

@BindView(R.id.login_btn_login)
Button btn_login;

Adapter中ViewHolder使用,注意:是this

public MyViewHolder(View itemView){super(itemView);ButterKnife.bind(this, itemView);
}

Button点击事件:@OnClick

@OnClick({R.id.login_btn_login})
public void onViewClicked(View view) {switch (view.getId()) {case R.id.login_btn_login:break;default:break;}}

CheckBox点击事件:@OnCheckedChanged

@OnCheckedChanged({R.id.login_cb_remember_password, R.id.login_cb_auto_login})
public void onViewCheckedChanged(CompoundButton compoundButton, boolean isChecked) {switch (compoundButton.getId()) {case R.id.login_cb_remember_password:if (isChecked) {} else {}break;case R.id.login_cb_auto_login:if (isChecked) {} else {}break;}}

RadioButton点击事件:@OnClick

@OnClick({R.id.rb_man, R.id.rb_woman})
public void onViewCheckedChanged(RadioButton radioButton) {boolean checked = radioButton.isChecked();switch (radioButton.getId()) {case R.id.rb_man:if (checked) {}break;case R.id.rb_woman:if (checked) {}break;}}

ViewPager事件监听:@OnPageChange

@OnPageChange(R.id.viewpager)
public void onPageSelected(int position) {switch (position) {case 0:break;case 1:break;}}

Demo下载地址:ButterKnifeDemo

ButterKnife使用方法详解相关推荐

  1. python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解

    如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...

  2. python修改文件内容_Python批量修改文本文件内容的方法详解

    这篇文章主要介绍了Python批量修改文本文件内容的方法的相关资料,需要的朋友可以参考下 Python批量替换文件内容,支持嵌套文件夹 import os path="./" fo ...

  3. python二维元组_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)

    如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, ...

  4. Spring JdbcTemplate方法详解

    2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...

  5. golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...

    Golang 实现 PHP里的 serialize() . unserialize() 安装 go get -u github.com/techleeone/gophp/serialize 用法 pa ...

  6. ES5和ES6数组遍历方法详解

    ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...

  7. linux expect 输入密码,shell脚本无密码登录 expect的使用方法详解

    shell脚本无密码登录 expect的使用方法详解 今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了. 从 ...

  8. 饥荒怎么自动订阅服务器,饥荒联机版自动挂礼物mod及使用方法详解

    饥荒联机版中官方经常会推出一些挂机掉落礼物的活动,可能一些玩家会觉得很麻烦,下面给大家分享一些自动挂礼物mod和其使用方法,希望可以帮助到各位玩家. 饥荒联机版自动挂礼物mod及使用方法详解 挂礼物m ...

  9. linux oracle 用户创建,LINUX下Oracle数据库用户创建方法详解

    本文实例分析了LINUX下Oracle数据库用户创建方法.分享给大家供大家参考,具体如下: 1)登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切 ...

最新文章

  1. VS 远程调试 Azure Web App
  2. Python中集合的介绍以及常见操作
  3. 剑指offer之31-35题解
  4. 图神经网络(二)GCN的性质(3)GCN是一个低通滤波器
  5. dm368ipnc 重写架构中的swosd 实现中文osd
  6. 信元模式mpls 避免环路_【基础】交换机堆叠模式
  7. 腾讯视频下载安装免费2020_腾讯视频app的哪里发贴
  8. oracle 删除jobs日志,修改Oracle的Job Scheduler 日志级别及删除运行日志
  9. ADT(Android) — Eclipse开发连接夜神模拟器方法(亲测有效!)
  10. EasyUI:datagrid清空所有选择行
  11. Python爬虫案例:下载酷某音乐文件
  12. VIP文档复制文字方法
  13. 动漫头像1000张萌妹子图片,可以做高清头像壁纸
  14. 微信公众号模板消息 换行
  15. Tikhonov regularization 吉洪诺夫 正则化
  16. redis cli命令详解
  17. Weekly Recap!相对不平淡的行情 相对冷淡的 DeFi 市场
  18. 集中式自动驾驶控制域中的高精地图数据解析算法
  19. 学习Servlet2
  20. 更进阶的实战效率、更准确的研究成果——欢迎参加材料计算PWmat进阶小组会

热门文章

  1. 复杂网络数据集下载地址
  2. CFileDialog类示例
  3. java删除空行空行_java删除空行
  4. NRC新世界城,实名制的区块链如何加快应用落地?
  5. 2021-04-18 读书笔记-白鹿原
  6. chatGPT回答字数限制解除-怎么突破chatGPT长度的限制
  7. 分水岭算法实现岩石分割
  8. 教你如何安装 Internet 信息服务
  9. 《从实践中学嵌入式Linux应用程序开发》pdf完整版资源分享
  10. C语言中static用法详解