这段时间学习了下ButterKnife注解框架,学习的不是特别深入,但是基础也差不多了,在此记录总结一下。

  ButterKnife是一个Android View注入的库,主要是注解的使用,可以减少很多代码的书写,使代码结构更加简洁和整齐。ButterKnife可以避免findViewById的调用,android开发的人都知道在Android初始化控件对象的时候要不断地调用findviewById,有多少控件就需要调用多少次,而使用ButterKnife可以省去findViewById的调用,不仅如此还可以省去监听事件的冗长代码,只需要一个注解就可以完成。下面我们来看看ButterKnife到底是如何使用的。

一、如何引入ButterKnife?

1. 首先是在Project的gradle中添加依赖:

 dependencies {
//butterknife的导入
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}

2. 在app的gradle中添加如下: 
在gradle中添加:

 apply plugin: 'android-apt'

在gradle的dependencies中添加:

dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0'
}

3. rebuild就完成了。

这里关于Project和app中build.gradle的区别可以参考这篇文章:Android Project和app中两个build.gradle配置的区别

二、如何使用?

注意:button 的修饰类型不能是:private 或者 static 。 否则会报错:错误: @BindView fields must not be private or static. (com.zyj.wifi.ButterknifeActivity.button1)

(一)、View的绑定

1. 控件id的注解:@BindView()

 @BindView(R.id.toolbar)
public Toolbar toolbar;

然后再Activity的onCreate()中调用:

 ButterKnife.bind( this ) ;

2. 多个控件id 注解: @BindViews()

     @BindViews({ R.id.button1  , R.id.button2 ,  R.id.button3 })
public List<Button> buttonList ;

然后再Activity的onCreate()中调用:

 ButterKnife.bind( this ) ;

3. 绑定其他View中的控件 
Butter Knife提供了bind的几个重载,只要传入跟布局,便可以在任何对象中使用注解绑定。调用ButterKnife.bind(view. this);方法。但是一般调用 Unbinder unbinder=ButterKnife.bind(view, this)方法之后需要在调用 unbinder.unbind()解绑。 
所以一般在activity中调用之后再绑定其他的view中的控件时我都会使用(四)中的方法。

(二)、资源的绑定

 <resources>
<string name="hello">Hello</string>
<string-array name="array">
<item>hello</item>
<item>hello</item>
<item>hello</item>
<item>hello</item>
</string-array>
</resources>

1. @BindString() :绑定string 字符串

     @BindString(R.string.hello)
public String hello;

然后再Activity的onCreate中调用:

 ButterKnife.bind( this ) ;

2. @BindArray() : 绑定string里面array数组

     @BindArray(R.array.array)  //绑定string里面array数组
String [] array;

然后再Activity的onCreate()中调用:

 ButterKnife.bind( this ) ;

3. @BindBitmap( ) : 绑定Bitmap 资源

     @BindBitmap(R.mipmap.ic_launcher)
public Bitmap bitmap;

然后再Activity的onCreate()中调用:

 ButterKnife.bind( this ) ;

6. 其他资源 
绑定BindColor(),BindDimen(),BindDrawable(),BindInt()等都是同样的方法,(1). 绑定资源。 (2).调用ButterKnife.bind()方法。

(三)、事件的绑定

1. 绑定OnClick方法

     @OnClick(R.id.login_activity_button_login)
public void clickLogin() {
}

然后再Activity的onCreate()中调用:

 ButterKnife.bind( this ) ;

如果绑定多个id的话,用“,”逗号隔开。

(四)、其他

Butter Knife提供了一个findViewById的简化代码:findById,用这个方法可以在View、Activity和Dialog中找到想要View,而且,该方法使用的泛型来对返回值进行转换,也就是说,你可以省去findViewById前面的强制转换了。

 View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);

ButterKnife.bind的调用可以被放在任何你想调用findViewById的地方。

Android ButterKnife注解框架使用的更多相关文章

  1. Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Zelezny

    首先提下ButterKnifey已经更新到版本7.0.1了,现在注解已经不叫@InjectView了,而叫@Bind,感觉更贴合语义.同时注册的方式也从 ButterKnife.inject(this ...

  2. ButterKnife注解框架详解

    Android 懒人注解框架 :https://github.com/JakeWharton/butterknife 前言: 注解,相信很多同学都用到了,对控件进行初始化的时候需要用到 findVie ...

  3. Android ButterKnife注解式开发

    在Android开发中findViewById和setOnClickListener解脱写法. 在任意的一个类中 @Bind(R.id.et) EditText editText; @OnClick( ...

  4. 开源框架相关面试问题-butterknife注解框架面试问题讲解

    butterknife使用简介: 它的出现主要是为了解决咱们在android开发中会写大量的findViewById().setOnClickListener()这样的索然无味的代码,其实它就是一个依 ...

  5. [旧][Android] ButterKnife 浅析

    备注 原发表于2016.05.08,资料已过时,仅作备份,谨慎参考 前言 自上星期写 Retrofit 写吐之后 ... 我问大队长能不能换个其他什么东西写,大队长就说了个单词 ButterKnife ...

  6. Android注解框架实战-ButterKnife

    文章大纲 Android注解框架介绍 ButterKnife实战 项目源码下载   一.框架介绍 为什么要用注解框架?  在Android开发过程中,我们经常性地需要操作组件,操作方法有findVie ...

  7. Android 注解框架对比

    Java的注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,标记可以加在包,类,属性,方法,本地变量上.然后你可以写一个注解处理器去解析处理这些注解(人称编译时注解 ...

  8. 开发自己的山寨Android注解框架

    目录 开发自己的山寨Android注解框架 开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能 ...

  9. Android Butterknife框架

    Android Butterknife框架 注解攻略 时间 2014-02-27 09:28:09  Msquirrel原文  http://www.msquirrel.com/?p=95 一.原理. ...

随机推荐

  1. Python 根据地址获取经纬度及求距离

    方法一: 使用Geopy包 : https://github.com/geopy/geopy   (仅能精确到城镇,具体街道无结果返回) from geopy.geocoders import Nom ...

  2. redis aof文件过大问题

    http://www.itnose.net/detail/6682725.html 最近新安装了一台redis,版本为redis-3.2.5 数据盘用的是固态硬盘. 之前用的是普通硬盘,redis日志 ...

  3. Mathtype公式位置偏上

    Mathtype公式位置偏上 部分Mathtype公式与文档文字没有很好的对齐,而是浮起来了,也就是说Mathtype公式的位置比正常文字稍高,这是我写论文时碰到的一个很麻烦的问题.然后就是行距稍微大 ...

  4. Codefroces 919D Substring(拓扑排序+DP)

    题目链接:http://codeforces.com/problemset/problem/919/D 题目大意:给你一张有向图,给你每个顶点上的字母和一些边,让你找出一条路径,路径上的相同字母数最多 ...

  5. 二、python框架相关知识体系

    Django框架 1.django框架.flask框架和Tornado框架的区别? django框架,内置组件多,自身功能强大,是一个大而全的框架,ORM.Admin.中间件.Form.ModelFr ...

  6. csu 1769(数学)

    1769: 想打架吗?算我一个!所有人,都过来!(3) Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 262  Solved: 76[Submit][S ...

  7. Android学习笔记(四) 定时器Timer

    Android考虑到线程安全问题,不允许在线程中执行UI线程. 所以在线程中不允许有UI操作 可以利用Handler机制来接收Timer每隔一秒发出的信息,也可以直接利用handler机制的 1.方法 ...

  8. 洛谷 P1469 找筷子 题解

    题目传送门 先排序一遍,再一个一个判断是否有偶数个.注意for循环要i+=2. #include<bits/stdc++.h> using namespace std; ]; int ma ...

  9. OPENSSL问题,使用fsockopen()函数提示错误

    环境配置 系统环境 CentOS7.2WDCP v3.2.2 lanmp PHP 多版本 指定使用5.6 OpenSSL 1.0.2h  3 May 2016 php.ini相关设置allow_url ...

  10. GUC-2 原子性

    import java.util.concurrent.atomic.AtomicInteger; /* * 一.i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” * int i ...