ButterKnife使用详解

Android编程过程中,我们会写大量的布局和点击事件,像初始view、设置view监听这样简单而重复的操作让人觉得麻烦类,所以可以采用注解的方式去实现,而ButterKnife则是注解中相对简单易懂的很不错的开源框架,而网上的文档和例子都过时了,7.0之后的版本改动很大,之前的注解都不能用了,所以借鉴官方文档总结了一下,接下来就介绍一下如何使用。基本参照官方文档,加上自己的心得。

ButterKnife 优势:

1.强大的View绑定和Click事件处理功能,简化代码,提升开发效率

2.方便的处理Adapter里的ViewHolder绑定问题

3.运行时不会影响APP效率,使用配置方便

4.代码清晰,可读性强

使用心得:

1.Activity ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind

2.Fragment ButterKnife.bind(this, mRootView);

3.属性布局不能用private or static 修饰,否则会报错

4.setContentView()不能通过注解实现。(其他的有些注解框架可以)

官网http://jakewharton.github.io/butterknife/

使用步骤:

一.导入ButterKnife jar包:

1)如果你是Eclipse,可以去官网下载jar包

2)如果你是AndroidStudio可以直接 File->Project Structure->Dependencies->Library dependency 搜索butterknife即可,第一个就是

3)当然也可以用maven和gradle配置

[html] view
plain
 copy

  1. MAVEN
  2. <dependency>
  3. <groupId>com.jakewharton</groupId>
  4. <artifactId>butterknife</artifactId>
  5. <version>(insert latest version)</version>
  6. </dependency>
  7. GRADLE
  8. compile ‘com.jakewharton:butterknife:(insert latest version)‘
  9. Be sure to suppress this lint warning in your build.gradle.(关闭)
  10. lintOptions {
  11. disable ‘InvalidPackage‘
  12. }

注:官网github也有对应的引用步骤。

二.常见使用方法:

1)由于每次都要在Activity中的onCreate绑定Activity,所以个人建议写一个BaseActivity完成绑定,子类继承即可

注:ButterKnife.bind(this);绑定Activity 必须在setContentView之后:

实现如下(FragmentActivity 实现一样):

[java] view
plain
 copy

  1. public abstract class BaseActivity extends Activity {
  2. public abstract int getContentViewId();
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(getContentViewId());
  7. ButterKnife.bind(this);
  8. initAllMembersView(savedInstanceState);
  9. }
  10. protected abstract void initAllMembersView(Bundle savedInstanceState);
  11. @Override
  12. protected void onDestroy() {
  13. super.onDestroy();
  14. ButterKnife.unbind(this);//解除绑定,官方文档只对fragment做了解绑
  15. }
  16. }

2)绑定fragment

[java] view
plain
 copy

  1. public abstract class BaseFragment extends Fragment {
  2. public abstract int getContentViewId();
  3. protected Context context;
  4. protected View mRootView;
  5. @Nullable
  6. @Override
  7. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  8. mRootView =inflater.inflate(getContentViewId(),container,false);
  9. ButterKnife.bind(this,mRootView);//绑定framgent
  10. this.context = getActivity();
  11. initAllMembersView(savedInstanceState);
  12. return mRootView;
  13. }
  14. protected abstract void initAllMembersView(Bundle savedInstanceState);
  15. @Override
  16. public void onDestroyView() {
  17. super.onDestroyView();
  18. ButterKnife.unbind(this);//解绑
  19. }
  20. }

3)绑定view

[java] view
plain
 copy

  1. @Bind(R.id.hello_world)
  2. TextView mHelloWorldTextView;
  3. @Bind(R.id.app_name)
  4. TextView mAppNameTextView;//view

4)绑定资源

[java] view
plain
 copy

  1. @BindString(R.string.app_name)
  2. String appName;//sting
  3. @BindColor(R.color.red)
  4. int textColor;//颜色
  5. @BindDrawable(R.mipmap.ic_launcher)
  6. Drawable drawable;//drawble
  7. @Bind(R.id.imageview)
  8. ImageView mImageView;
  9. @Bind(R.id.checkbox)
  10. CheckBox mCheckBox;
  11. @BindDrawable(R.drawable.selector_image)
  12. Drawable selector;

5)Adapter ViewHolder 绑定

[java] view
plain
 copy

  1. public class TestAdapter extends BaseAdapter {
  2. private List<String> list;
  3. private Context context;
  4. public TestAdapter(Context context, List<String> list) {
  5. this.list = list;
  6. this.context = context;
  7. }
  8. @Override
  9. public int getCount() {
  10. return list==null ? 0 : list.size();
  11. }
  12. @Override
  13. public Object getItem(int position) {
  14. return list.get(position);
  15. }
  16. @Override
  17. public long getItemId(int position) {
  18. return position;
  19. }
  20. @Override
  21. public View getView(int position, View convertView, ViewGroup parent) {
  22. ViewHolder holder;
  23. if (convertView == null) {
  24. convertView = LayoutInflater.from(context).inflate(R.layout.layout_list_item, null);
  25. holder = new ViewHolder(convertView);
  26. convertView.setTag(holder);
  27. } else {
  28. holder = (ViewHolder) convertView.getTag();
  29. }
  30. holder.textview.setText("item=====" + position);
  31. return convertView;
  32. }
  33. static class ViewHolder {
  34. @Bind(R.id.hello_world)
  35. TextView textview;
  36. public ViewHolder(View view) {
  37. ButterKnife.bind(this, view);
  38. }
  39. }
  40. }

6)点击事件的绑定:不用声明view,不用setOnClickLisener()就可以绑定点击事件

a.直接绑定一个方法

[java] view
plain
 copy

  1. @OnClick(R.id.submit)
  2. public void submit(View view) {
  3. // TODO submit data to server...
  4. }

b.所有监听方法的参数是可选的

[java] view
plain
 copy

  1. @OnClick(R.id.submit)
  2. public void submit() {
  3. // TODO submit data to server...
  4. }

c.定义一个特定类型,它将自动被转换

[java] view
plain
 copy

  1. @OnClick(R.id.submit)
  2. public void sayHi(Button button) {
  3. button.setText("Hello!");
  4. }

d.多个view统一处理同一个点击事件,很方便,避免抽方法重复调用的麻烦

[java] view
plain
 copy

  1. @OnClick({ R.id.door1, R.id.door2, R.id.door3 })
  2. public void pickDoor(DoorView door) {
  3. if (door.hasPrizeBehind()) {
  4. Toast.makeText(this, "You win!", LENGTH_SHORT).show();
  5. } else {
  6. Toast.makeText(this, "Try again", LENGTH_SHORT).show();
  7. }
  8. }

e.自定义view可以绑定自己的监听,不指定id

[java] view
plain
 copy

  1. public class FancyButton extends Button {
  2. @OnClick
  3. public void onClick() {
  4. // TODO do something!
  5. }
  6. }

f.给EditText加addTextChangedListener(即添加多回调方法的监听的使用方法),利用指定回调,实现想回调的方法即可,哪个注解不会用点进去看下源码上的注释就会用了

[java] view
plain
 copy

  1. @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)
  2. void beforeTextChanged(CharSequence s, int start, int count, int after) {
  3. }
  4. @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback.TEXT_CHANGED)
  5. void onTextChanged(CharSequence s, int start, int before, int count) {
  6. }
  7. @OnTextChanged(value = R.id.mobileEditText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
  8. void afterTextChanged(Editable s) {
  9. }

7)对一组View进行统一操作

a.装入一个list

[java] view
plain
 copy

  1. @Bind({ R.id.first_name, R.id.middle_name, R.id.last_name })
  2. List<EditText> nameViews;

b.设置统一处理

[java] view
plain
 copy

  1. static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {
  2. @Override public void apply(View view, int index) {
  3. view.setEnabled(false);
  4. }
  5. };
  6. static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {
  7. @Override public void set(View view, Boolean value, int index) {
  8. view.setEnabled(value);
  9. }
  10. };

c.统一操作处理,例如设置是否可点,属性等

[java] view
plain
 copy

  1. ButterKnife.apply(nameViews, DISABLE);
  2. ButterKnife.apply(nameViews, ENABLED, false);

8)可选绑定:默认情况下,“绑定”和“监听”绑定都是必需的。如果不能找到目标视图,则将抛出异常。所以做空处理

[java] view
plain
 copy

  1. @Nullable @Bind(R.id.might_not_be_there) TextView mightNotBeThere;
  2. @Nullable @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() {
  3. // TODO ...
  4. }

三、代码混淆

[java] view
plain
 copy

  1. -keep class butterknife.** { *; }
  2. -dontwarn butterknife.internal.**
  3. -keep class **$$ViewBinder { *; }
  4. -keepclasseswithmembernames class * {
  5. @butterknife.* <fields>;
  6. }
  7. -keepclasseswithmembernames class * {
  8. @butterknife.* <methods>;
  9. }

四、Zelezny插件的使用

在AndroidStudio->File->Settings->Plugins->搜索Zelezny下载添加就行 ,可以快速生成对应组件的实例对象,不用手动写。使用时,在要导入注解的Activity 或 Fragment 或 ViewHolder的layout资源代码上,右键——>Generate——Generate ButterKnife Injections,然后就出现如图的选择框。(此动态图来自官网)

时间: 2024-10-26 18:16:07

ButterKnife使用详解的相关文章

butterknife源码详解

butterknife源码详解 作为Android开发者,大家肯定都知道大名鼎鼎的butterknife.它大大的提高了开发效率,虽然在很早之前就开始使用它了,但是只知道是通过注解的方式实现的,却一直没有仔细的学习下大牛的代码.最近在学习运行时注解,决定今天来系统的分析下butterknife的实现原理. 如果你之前不了解Annotation,那强烈建议你先看注解使用. 废多看图: 从图中可以很直观的看出它的module结构,以及使用示例代码. 它的目录和我们在注解使用这篇文章中介绍的一样,大体

ButterKnife与BindView使用详解

ButterKnife与BindView使用详解ButterKnife的优势具有强大的view绑定和click事件处理能力方便处理Adapter里的viewHolder绑定问题运行时不会影响app效率,配置方便代码清晰,可读性强. 使用方法以及注意事项:在Activity中ButterKnife.bind(this);必须在setContentView();之后,且父类bind绑定后,子类不需要再bind在Fragment中ButterKnife.bind(this, view);在Adapte

build.gradle文件详解&lt;三&gt;

参考:http://blog.csdn.net/baidu_31093133/article/details/51860637 build.gradle配置参数详解 //声明是Android程序 apply plugin: 'com.android.application' android { //程序在编译的时候会检查lint,有任何错误提示会停止build,我们可以关闭这个开关 lintOptions { abortOnError false //即使报错也不会停止打包 checkRelea

RecyclerView使用详解(二)

在上一篇(RecyclerView使用详解(一))文章中简单的介绍了RecyclerView的基本用法,接下来要来讲讲RecyclerView的更多用法,要实现不同的功能效果,大部分都还是在于RecyclerView的Adapter写法,所以我们着重来看看几种不同功能的Adapter写法. 一.多Item布局实现(MultipleItem) 如果之前你用过ListView实现过此功能,那么你一定对下面这两个方法并不陌生 @Override public int getItemViewType(i

详解Android主流框架不可或缺的基石

自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 自定义View系列教程08–滑动冲突的产生及其处理

Android App优化之ANR详解

引言 背景:Android App优化, 要怎么做? Android App优化之性能分析工具 Android App优化之提升你的App启动速度之理论基础 Android App优化之提升你的App启动速度之实例挑战 Android App优化之Layout怎么摆 Android App优化之ANR详解 Android App优化之消除卡顿 Android App优化之内存优化 Android App优化之持久电量 Android App优化之如何高效网络请求 App优化系列已近中期, 前面分

Java注解(Annotation)详解

转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotation的概念 An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotate

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h