Butter Knife介绍

【准备工作】 Android Studio中使用只需要在Gradle中配置:
compile 'com.jakewharton:butterknife:7.0.1'
同时还可以安装AS插件:Android ButterKnife Zelezny 
两者都配置好后,只需要以下两步就可以轻松搞定:
(1)代码中将光标定格在布局文件上。
(2) 右键 Generate -> Generate Butterknife Injections。 

1.ButterKnife中,在你的View或布局上使用注释@Bind来标示,它会自动将ID字段和View进行绑定。

class ExampleActivity extends Activity { @Bind(R.id.title) TextView title; @Bind(R.id.subtitle) TextView subtitle; @Bind(R.id.footer) TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.bind(this); // TODO Use fields... } }
它将会代替慢反射,生成的代码可以使用视图进行查找。你可以查看和调试在使用了bind方法所生成的代码。

对于上面的例子中生成的代码大致如下所示:

public void bind(ExampleActivity activity) { activity.subtitle = (android.widget.TextView) activity.findViewById(2130968578); activity.footer = (android.widget.TextView) activity.findViewById(2130968579); activity.title = (android.widget.TextView) activity.findViewById(2130968577); }
2.非行为约束
你也可以执行任意对象结合并将其绑定在一起。

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); // TODO Use fields... return view; } }
3.另一个用途是简化适配器列表里面的ViewHolder的绑定:

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("John Doe"); // etc... 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); } } }
从上面的例子中你可以看到代码是如何实现的。

使用ButterKnife的bind可以将任何findViewById的代码进行简化,使用bind来绑定。

4.其他提供绑定API:
使用活动为视图根绑定任意对象。如果你使用的模式像MVC你可以利用其活性ButterKnife.bind(这一点,活动)绑定控制器。

绑定视图的子View尽量使用ButterKnife.bind方法。如果您使用在布局<合并>标记和自定义视图构造也可以后立即调用它。或者,当自定义的View视图在onFinishInflate()回调后使用bind进行绑定。

5.你可以将多个View视图绑定到一个列表集合或数组里面:

@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);
即对nameViews集合中的View设置DISABLE护着ENABLED等操作。

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);  }};
从上面可以看到,使用Action和Setter都可以指定一个简单的行为,Setter可以设置成根据一个值设定其View的具体行为。


6.可选的Bind操作:

默认情况下,@Bind和监听绑定某个具体的View是必需的。如果目标视图不能找到一个异常将被抛出。

为了抑制这种行为,创造一个可选的绑定,可以给属性或方法添加注释@Nullable。

注意:任何命名@Nullable注解可以用于此目的。并且鼓励使用@Nullable注解从Android的“支持批注”库,以解决在bind和具体View绑定时,当View无法找到而抛出异常的问题。具体请参阅Android的工具项目。

@Nullable @Bind(R.id.might_not_be_there) TextView mightNotBeThere; @Nullable @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() { // TODO ... }
7.多个方法监听:

方法注解,其相应的监听器具有多个回调可用于结合它们中的任何一个。每个注释具有其结合到一个缺省的回调。使用指定回调参数备用。

@OnItemSelected(R.id.list_view) void onItemSelected(int position) { // TODO ... } @OnItemSelected(value = R.id.maybe_missing, callback = NOTHING_SELECTED) void onNothingSelected() { // TODO ... }
8. 此外,它还包括简化了根据某个加载出来的视图去获取View。它使用泛型推断返回类型,并自动进行转换。

View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = ButterKnife.findById(view, R.id.first_name);
TextView lastName = ButterKnife.findById(view, R.id.last_name);
ImageView photo = ButterKnife.findById(view, R.id.photo);
很容易,直接使用ButterKnife的静态方法findById就可以轻松实现了。

享受其中的强大和有趣吧。

本文翻译自:http://jakewharton.github.io/butterknife/,个人翻译程度有限,还请小伙伴们多多支持!

更多相关文章

  1. Android设置程序最小运行的堆内存
  2. android NumberPicker 全面解析
  3. Android(安卓)倒计时实现,显示剩余时分秒
  4. android打开系统相册的一些方法
  5. android studio 中报Error:Execution failed for task ':app:mer
  6. Android数据库中查找一条数据使用的方法 query详解
  7. Android(安卓)App 退出整个应用
  8. Android动态加载View的几种方法
  9. TabActivity子类中处理返回键事件

随机推荐

  1. 安装应用android批量安装APK
  2. 【腾讯Bugly干货分享】Android(安卓)进程
  3. 20个经典Android游戏源码下载地址(持续更
  4. Android通讯录字母排序城市列表展示效果
  5. 实现Android(安卓)动态加载APK(Fragment o
  6. android中反射的应用
  7. Anroid音视频开发
  8. Android移动开发-获取Android移动设备上
  9. android 自定义状态栏和导航栏分析与实现
  10. 2016年Android市场的8个大胆预测