Android注解框架实战-ButterKnife
文章大纲
- Android注解框架介绍
- ButterKnife实战
- 项目源码下载

一、框架介绍
为什么要用注解框架?
在Android开发过程中,我们经常性地需要操作组件,操作方法有findViewById, setOnClickListener等等方法,这个过程会让工程师抓狂的,好在市面已经有大神封装好的的注解框架可以帮助开发者简化一些过程,下面就让我来给大家介绍一些常见的注解框架。
ButterKnife框架介绍
首先看下Butterknife,来自Jakewharton大神的力作,特点是接入简单,依赖一个库就好了。另外在Android Studio上还有提供一个插件,自动生成注解与类属性。Butterknife目前支持的注解有: View绑定(Bind),资源绑定(BindBool, BindColor, BindDimen, BindDrawble, BindInt, BindString),事件绑定(OnCheckedChanged, OnClick, OnEditorAction, OnFocusChange, OnItemClick, OnItemLongClick, OnItemSelected, OnLongClick, OnPageChange, OnTextChanged, OnTouch),ButterKnife是在编译时候生成新的class文件,而不是在运行时处理这个逻辑,所以不影响使用性能。
AndroidAnnotations框架介绍
该框架的原理跟Butterknife一样,都是在编译时生成代码,不过annotations并不是生成代码供对应的类调用去给带注解的变量、方法赋值,而是直接生成一个继承带注解的类,这个类里面有对变量赋值,对注解方法调用的代码。运行时,直接运行的是annotations生成的类,而不是我们写的类。
XUtils框架介绍
xutils的使用方式跟Butterknife一样,都是在成员变量,方法上添加注释,然后调用一个方法(xutils是ViewUtils.inject()方法)对成员变量赋值、事件方法设置到view上。不同的是,Butterknife是调用自动生成的代码来赋值,而xutils是通过反射来实现的。
温馨提示:
- 虽然现在的反射速度也很快了,但是还是不能跟原生代码相比,一旦注释用的多了,这初始化速度会越来越慢。通过上面注释处理的代码可以看出,xutils支持的注释目前主要有UI, 资源,事件,SharedPreference绑定。跟xutils一样是运行时利用反射去解析注释的框架还有afinal, roboguice等。
- 市面上还有很多其他的注释框架,但是万变不离其宗,不是反射就是自动生成代码。反射功能虽然强大,但是不可取,不仅会拖慢速度还会破话程序的封装性。个人认为生成代码的方案比较好,所有的功能都在编译时做了,并不会影响到用户的体验,唯一的缺点就是比反射难实现,不过我们程序不就是把难处留给自己,把快乐留给用户么!
二、ButterKnife实战
1. 添加xml布局

2. 在app的build.gradle中添加以下依赖

3. studio中下载插件



温馨提示:下载后,一般studio会自动提示重启
3. 添加ButterKnife声明

温馨提示:
Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind。Fragment ButterKnife.bind(this, mRootView);这里的this不能替换成getActivity()。
- 获取组件并添加绑定关系
右击布局,选择以下内容
选择以下内容


选择后自动生成以下代码:

温馨提示:属性布局不能用private or static 修饰,否则会报错
编译后运行程序,截图如下图所示:

其他绑定方式介绍
绑定注解
@BindView---->绑定一个view;id为一个view 变量
@BindView(R.id.tv_fm1)
TextView tvFm1;
@BindViews ---->绑定多个view;id为一个view的list变量
@BindViews({ R.id.btn1,R.id.btn2 })
List<Button> buttons;
@BindArray---->绑定string里面array数组;
@BindArray(R.array.city )
String[] citys ;
@BindBitmap---->绑定图片资源为Bitmap;
@BindBitmap(R.mipmap.wifi )
Bitmap bitmap;
@BindBool ---->绑定boolean值
@BindColor ---->绑定color;
@BindColor(R.color.colorAccent)
int black;
@BindDimen ---->绑定Dimen;
@BindDimen(R.dimen.borth_width)
int mBorderWidth;
@BindDrawable ----> 绑定Drawable;
@BindDrawable(R.drawable.test_pic)
Drawable mTestPic;
@BindFloat ---->绑定float
@BindInt ---->绑定int
@BindString ---->绑定一个String id为一个String变量;
@BindString(R.string.app_name )
String meg;
事件注解
@OnClick---->点击事件
@OnCheckedChanged ---->选中,取消选中
@OnEditorAction ---->软键盘的功能键
@OnFocusChange ---->焦点改变
@OnItemClick item---->被点击(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)
@OnItemLongClick item---->长按(返回真可以拦截onItemClick)
@OnItemSelected ---->item被选择事件
@OnLongClick ---->长按事件
@OnPageChange ---->页面改变事件
@OnTextChanged ---->EditText里面的文本变化事件
@OnTouch ---->触摸事件
绑定view
1)@BindView() : 布局id 注解
@BindView( R2.id.button)
public Button button;
button 的修饰类型不能是:private 或者 static 。
2)@BindViews(): 布局内多个控件 id 注解
@BindViews({ R2.id.button1, R2.id.button2, R2.id.button3})
public List<Button> buttonList ;
ButterKnife.bind(this);
buttonList.get( 0 ).setText( "hello 1 ");
buttonList.get( 1 ).setText( "hello 2 ");
buttonList.get( 2 ).setText( "hello 3 ");
绑定资源
1)@BindString() :绑定string 字符串
@BindString(R2.string.app_name) //绑定资源文件中string字符串
String str;
button.setText( str );
2)@BindArray() : 绑定string里面array数组
@BindArray(R2.array.city) //绑定string里面array数组
String [] citys ;
button.setText(citys[0]);
3)@BindBitmap( ) : 绑定Bitmap 资源
@BindBitmap(R2.drawable.bm)//绑定Bitmap 资源
public Bitmap bitmap ;
imageView.setImageBitmap(bitmap);
drawable文件夹下的图片使用R或R2引用都没问题;但是mipmap文件夹下的图片资源引用目前只能使用R
4)@BindColor( ) : 绑定一个颜色值
@BindColor( R2.color.colorAccent ) //具体色值在color文件中
int black ; //绑定一个颜色值
button.setTextColor( black );
三、项目源码下载
链接:https://pan.baidu.com/s/1it6GSMiigaZOhYm5q8yWYg
提取码:iqdg
参考文章:
Android注解框架实战-ButterKnife的更多相关文章
- Android 注解框架对比
Java的注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,标记可以加在包,类,属性,方法,本地变量上.然后你可以写一个注解处理器去解析处理这些注解(人称编译时注解 ...
- 开发自己的山寨Android注解框架
目录 开发自己的山寨Android注解框架 开发自己的山寨Android注解框架 参考 Github黄油刀 Overview 在上一章我们学习了Java的注解(Annotation),但是我想大家可能 ...
- Android注解使用之ButterKnife 8.0注解使用介绍
前言: App项目开发大部分时候还是以UI页面为主,这时我们需要调用大量的findViewById以及setOnClickListener等代码,控件的少的时候我们还能接受,控件多起来有时候就会有一种 ...
- Android注解利器:ButterKnife 的基本使用
前言 ButterKnife 简介 ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一 ...
- Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架
前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...
- java注解框架
我们经常会在java代码里面看到:“@Override”,“@Target”等等样子的东西,这些是什么? 在java里面它们是“注解”. 下面是百度百科的解释:java.lang.annotation ...
- android注解使用详解(图文)
在使用Java的SSH框架的时候,一直在感叹注解真是方便啊,关于注解的原理,大家可以参考我的另一片文章Java注解详解.最近有时间研究了android注解的使用,今天与大家分享一下. android中 ...
- android注解使用具体解释(图文)
在使用Java的SSH框架的时候,一直在感叹注解真是方便啊,关于注解的原理,大家能够參考我的还有一片文章Java注解具体解释. 近期有时间研究了android注解的使用,今天与大家分享一下. andr ...
- Android ButterKnife注解框架使用
这段时间学习了下ButterKnife注解框架,学习的不是特别深入,但是基础也差不多了,在此记录总结一下. ButterKnife是一个Android View注入的库,主要是注解的使用,可以减少很多 ...
随机推荐
- Netty中解码基于分隔符的协议和基于长度的协议
在使用Netty的过程中,你将会遇到需要解码器的基于分隔符和帧长度的协议.本节将解释Netty所提供的用于处理这些场景的实现. 基于分隔符的协议 基于分隔符的(delimited)消息协议使用定义的字 ...
- SSM-Spring-02:Spring的DI初步加俩个实例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- DI:依赖注入 第一个DEMO:域属性注入 java类:(Car类和Stu类,学生有一辆小汽车) packag ...
- jquery选择器 看这个链接吧!2017.6.2
http://www.cnblogs.com/tylerdonet/archive/2013/04/02/2996713.html关于jquery选择器说明.
- charles模拟手机流量网速
找到proxy--throttle settings 勾选enable throttling,设置手机上网网速 选择throttle preset,有设置好的一些网速,可以随便选 也可以设置2G网络, ...
- Firefox Profile (2)
一些关于selenium copy Firefox profile to a temp directory的讨论 https://stackoverflow.com/questions/6787095 ...
- Sql函数笔记一、case when
Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- 【BZOJ 4652】【NOI 2016】循环之美
题目连接: 传送 题解: 真是一道好题…… 一: 一个分数$\frac{x}{y}$完全循环当其第一次出现时,当且仅当y与k互质,x与y互质,且y不等于1. 整数情况下y一定为1,即也满足以上判断. ...
- React从入门到放弃之前奏(5):ReactRouter4
概念 安装:npm i -S react-router react-router-dom GitHub:ReactTraining/react-router React Router中有三种类型的组件 ...
- C# 在异步线程操作类的变量
如下代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string Me ...
- HTML标题
HTML 标题 在 HTML 文档中,标题很重要. HTML 标题 标题(Heading)是通过 <h1> - <h6> 标签进行定义的. <h1> 定义最大的标题 ...