1. 简介
分析完Java中的反射(有关Java反射的使用看这一篇就够了)和注解(Java注解全面总结),如果就这样结束了,总感觉缺少了些什么,不拿一个开源库来分析分析,然后动手实践一遍,怎么能体会到反射和注解的博大精深呢。于是想到了Android中的一个开源库ButterKnife,用法简单,为我们减少了大量垃圾代码(例如findViewById)。本篇文章首先从ButterKnife的基本用法入手,然后着手分析ButterKnife的实现原理,最后自己动手撸一把,实现最简单的替换findViewById功能,能看到开源库并不代表就会了,只有自己动手实现一遍,才能够真正掌握,希望阅读完本篇文章,能够给大家一定的技术提升。
2. 基本用法
本篇文章重点在于ButterKnife的源码分析和动手实践,只是简单介绍下最基本用法,对于更多的用法细节,不在讨论范围内。
2.1 ButterKnife项目地址
https://github.com/JakeWharton/butterknife
2.2 基本配置
百度相关文章,看到很多博客在写AS配置ButterKnife的时候,都说首先需要在Project 的 build.gradle中添加相关代码,然后在APP的build.gradle中添加 apply plugin ……, 最后在dependencies中添加相关依赖等等,其实并非如此,虽然这样配置是不影响最终的结果的,但还是有些多余,或者说对于Module是application和Module是library,两者的配置是有些不一样的,可以参考官方文档。
1) Module为application的配置
如果你仅仅是在Module为application的模块下使用ButterKnife,那么配置非常简单,只需要在Module下的build.gradle文件中添加如下代码即可:
dependencies { ......... compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' }
2) Module为library的配置
如果你的Module为library,配置稍微复杂一点,其实也非常简单,首先在Project下的build.gradle添加如下代码:
buildscript { repositories { jcenter() } dependencies { ............ classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' } }
在library的build.gradle文件中添加如下代码:
扫描二维码关注公众号,回复: 3190901 查看本文章apply plugin: 'com.android.library' apply plugin: 'com.jakewharton.butterknife' // 新增
dependencies { .................. compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' }
2.3 基本使用
ButterKnife的使用十分简单,只是在Module是application和Module是library稍有不同,下面为Module是application的最简单使用方式:
public class ButterKnifeTestActivity extends AppCompatActivity {
@BindView(R.id.tv_show_info)
TextView tvInfo;
public static void startActivity(Context context){
Intent intent = new Intent(context, ButterKnifeTestActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_butter_knife_test);
//绑定初始化ButterKnife
ButterKnife.bind(this);
initView();
}
private void initView(){
tvInfo.setText("测试信息");
}
}
布局文件非常简单,此处就省略了,当进入该activity,textview显示的信息为 测试信息。如果Module是library的情况,需要将@BindView(R.id.tv_show_info) 中的R 修改为 R2即可,官方文档也有相关说明。
未完待续。。。