Butter Knife

github连接:https://github.com/JakeWharton/butterknife

本文使用的butterknife版本7.0.1

butterknife:使用依赖注入的方式为你的Android views绑定字段方法。

1控件绑定

  通过使用@bind和一个资源ID,butterknife会自动绑定到layout中声明资源。textview为例

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;import butterknife.Bind;
import butterknife.ButterKnife;public class MainActivity extends AppCompatActivity {@Bind(R.id.title)TextView title;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);title.setText("this is a test");}
}

2 res资源绑定

  通过使用@BindBool, @BindColor, @BindDimen, @BindDrawable, @BindInt, @BindString,绑定预定义的资源;

public class MainActivity extends AppCompatActivity {@BindString(R.string.app_name) String appName;@BindDrawable(R.mipmap.ic_launcher)Drawable drawable;@BindColor(R.color.colorAccent) int color;@BindDimen(R.dimen.activity_horizontal_margin) int margin;// int (for pixel size) or float (for exact value) field
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);}
}

Fragment中的绑定

public class FancyFragment extends Fragment {@Bind(R.id.button1) Button button1;@Bind(R.id.button2) Button button2;@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fancy_fragment, container, false);ButterKnife.bind(this, view);//这里调用的是bind(context,view)方法// TODO Use fields...return view;}
}

4   Adapter中的绑定  

public class MyAdapter extends BaseAdapter {@Override public View getView(int position, View view, ViewGroup parent) {ViewHolder holder;if (view != null) {holder = (ViewHolder) view.getTag();} else {view = inflater.inflate(R.layout.whatever, parent, false);holder = new ViewHolder(view);view.setTag(holder);}holder.name.setText("测试");return view;}static class ViewHolder {@Bind(R.id.title) TextView name;@Bind(R.id.job_title) TextView jobTitle;public ViewHolder(View view) {ButterKnife.bind(this, view);}}
}

其他绑定API:

  1. 使用Activity为根视图绑定任意对象时,如果你使用类似MVC的设计模式你可以在Activity 调用ButterKnife.bind(this, activity),来绑定Controller。

  2. 使用ButterKnife.bind(this)绑定一个view的子节点字段.如果你在子View的布局里或者自定义view的构造方法里 使用了inflate,你可以立刻调用此方法。或者,从XML inflate来的自定义view类型可以在onFinishInflate回调方法中使用它。

5View集合中的使用

 可以将多个view组成一个List或数组。

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

apply方法可以一次作用到所有的View。

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

Action 和 Setter 接口可以指定简单的行为。

static final ButterKnife.Action<View> DISABLE = new ButterKnife.Action<View>() {@Override public void apply(View view, int index) {view.setEnabled(false);}
};
static final ButterKnife.Setter<View, Boolean> ENABLED = new ButterKnife.Setter<View, Boolean>() {@Override public void set(View view, Boolean value, int index) {view.setEnabled(value);}
};

Android的Property(配置信息)也可以被用在apply方法中

ButterKnife.apply(nameViews, View.ALPHA, 0.0f);

6.监听器绑定

Butter knife可以自动将侦听器配置为方法。

@OnClick(R.id.submit)
public void submit(View view) {}@OnClick(R.id.submit)
public void submit() {}
//定义的指定类型将会被自动转换

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

指定多个id在一个单一的绑定事件中处理。

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

自定义View可以绑定自己的侦听器但是不用指定一个id。

public class MyButton extends Button {@OnClickpublic void onClick() {}
}

7.重置绑定

Fragment的生命周期与Activity不同,当我们在onCreateView绑定Fragment,在onDestroyView将View 设置为null时,可以使用unbind()方法。

public class FancyFragment extends Fragment {@Bind(R.id.button1) Button button1;@Bind(R.id.button2) Button button2;@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fancy_fragment, container, false);ButterKnife.bind(this, view);return view;}@Override public void onDestroyView() {super.onDestroyView();ButterKnife.unbind(this);}
}

8.可选绑定

默认情况下,”@Bind”和”@OnClick”(或者其他监听)监听绑定都是必需的。如果不能找到目标视图,则会引发异常。

为了制止这种行为,创建一个可选的结合,添加一个‘@Nullable’注解字段或方法。

任何名字为@Nullable的注解可以被这样使用。鼓励你使用Android自己的注解库”support-annotations”中的@Nullable注解,参见Android Tools Project.

@Nullable @Bind(R.id.might_not_be_there) TextView mightNotBeThere;@Nullable @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() {}

9.多元监听

与方法注解相匹配的监听器有多个回调可以被用来绑定在他们中间的任何一个身上。每一个注解都有默认的回调跟它绑定在一起。可以使用callback参数声明一个可替代的回调。

@OnItemSelected(R.id.list_view)
void onItemSelected(int position) {}@OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED)
void onNothingSelected() {}

10.在Android Studio 中配置

compile ‘com.jakewharton:butterknife:7.0.1’

11.代码混淆

在代码混淆的时候可能出问题,这时候需要在当前model下的proguard-rules.pro文件做如下修改:

-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }-keepclasseswithmembernames class * {@butterknife.* <fields>;
}-keepclasseswithmembernames class * {@butterknife.* <methods>;
}

参考:http://blog.csdn.net/i374711088/article/details/49102003

转载于:https://www.cnblogs.com/shiwei-bai/p/4958555.html

android Butter Knife 使用详解相关推荐

  1. html中添加butter按钮,Butter Knife使用详解

    Butter Knife 官方说明给出的解释是 Bind Android views and callbacks to fields and methods. Field and method bin ...

  2. android jar 包 意见反馈功能,android重点jar包详解.docx

    android重点jar包详解 深入理解View(一):从setContentView谈起 我们都知道?MVC,在Android中,这个?V?即指View,那我们今天就来探探View的究竟.在onCr ...

  3. Android应用坐标系统全面详解

    Android应用坐标系统全面详解 原文链接:CSDN@工匠若水,http://blog.csdn.net/yanbober/article/details/50419117 1. 背景 去年有很多人 ...

  4. Android NFC开发实战详解

    Android NFC开发实战详解 Android开发实战详解NFC国内第一本AndroidNFC开发书籍带你开启AndroidNFC开发的神秘之旅大综合案例帮助读者快速进入实战角色:WiFi快速连接 ...

  5. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  6. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  7. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github:  https://github.com/ReactiveX/RxJava  https://githu ...

  8. Android自定义属性,format详解

    1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name="名称"><attr name="bac ...

  9. android layout_width 属性,android:layout_weight属性详解

    在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示.android并没用提 ...

最新文章

  1. Eclipse集成Tomcat:6个常见的”how to”问题
  2. [Hadoop in China 2011] 何鹏:Hadoop在海量网页搜索中应用分析
  3. 今天分享下移动端rem 适配
  4. DALI调光的计算方式
  5. matlab如果不想立即在,科学计算与MATLAB 1.5
  6. Spring Boot + WebMagic 实现网页爬虫,写得太好了!
  7. ionic3 打包错误解决:Could not resolve all files for configuration ':classpath'.
  8. onclick 如何传数据_云主机文件传输神器:免占公网带宽,文件极速秒传
  9. PHP连接 SQLSERVER 注意事项(经典中的经典)
  10. 学生信息管理系统(纯前端页面)———无后端数据库
  11. 写给美术看的Unity全局光照详解
  12. 计算机win加r,快捷键win+r是什么意思_打开运行快捷键win+r怎么按
  13. 关于ANSYS17的安装教程出现安装问题的解决方案
  14. C++ 实现贪吃蛇游戏(免费附源码)
  15. 四/六层板层叠设计思路
  16. cwber获取html,qq飞车手游CW、CWW、WCW怎么触发方法
  17. grep检索关键字的命令_文件中查找关键字“ ”命令 grep
  18. 21世纪,黑客是这样抢银行的
  19. 微pe工具箱+软碟通 制作 U盘启动盘
  20. 海思AI芯片(Hi3519A/3559A)方案学习(十七)开发板上运行yolo3模型的代码分析

热门文章

  1. 获取文件绝对路径和目录
  2. XML解析方式(来自 传智播客 方立勋视频教程)
  3. 用ffmpeg把H264数据流解码成YUV420P
  4. mysql 主从报错
  5. 转置型FIR滤波器的fpga实现
  6. 使用librosa计算pcen
  7. 训练神经网络最应该注意什么才能让显卡最大限度的发挥性能
  8. ES6-Promise对象
  9. ASP.NET WebApi技术从入门到实战演练
  10. 如何用css让一个容器水平垂直居中