关闭

ButterKnife是一个专注于Android系统的View注入框架

245人阅读 评论(0) 收藏 举报
分类:

俗话说:“不会偷懒的程序员不是好的程序员!”。作为一名Android开发,是不是经常厌烦了大量的findViewById以及setOnClickListener代码,而ButterKnife是一个专注于Android系统的View注入框架,让你从此从这些烦人臃肿的代码中解脱出来。先来看一段代码示例说明下ButterKnife是如何简化代码的:

注意:如果你是使用的Eclipse引用该library,你需要参考这里Eclipse Configuration做一些配置,否则会运行出错。

class ExampleActivity extends Activity {
  TextView title;
  TextView subtitle;
  TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    title = (TextView) findViewById(R.id.title);
    subtitle = (TextView) findViewById(R.id.subtitle);
    footer = (TextView) findViewById(R.id.footer);

    // TODO Use views...
  }
}

而用ButterKnife之后的代码是这样的:

class ExampleActivity extends Activity {
  @InjectView(R.id.title) TextView title;
  @InjectView(R.id.subtitle) TextView subtitle;
  @InjectView(R.id.footer) TextView footer;

  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.inject(this);
    // TODO Use "injected" views...
  }
}

是不是非常简洁易用?下面就来系统的介绍下ButterKnife的用法。

Butter Knife 的特性

  1. 支持 Activity 中的 View 注入

  2. 支持 View 中的 View 注入

  3. 支持 View 事件回调函数注入

目前支持如下事件回调函数:

  • View: @OnLongClick and @OnFocusChanged.

  • TextView: @OnEditorAction.

  • AdapterView: @OnItemClick and @OnItemLongClick.

  • CompoundButton: @OnCheckedChanged.

下面来看一些注入的示例代码:

在Activity 中注入

class ExampleActivity extends Activity {
  @InjectView(R.id.title) TextView title;
  @InjectView(R.id.subtitle) TextView subtitle;
  @InjectView(R.id.footer) TextView footer;
 
  @Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.inject(this);
    // TODO Use "injected" views...
  }
}

在 Fragment 中注入

public class FancyFragment extends Fragment {
  @InjectView(R.id.button1) Button button1;
  @InjectView(R.id.button2) Button button2;
 
  @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.inject(this, view);
    // TODO Use "injected" views...
    return view;
  }
}

在 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 convertView;
  }
 
  static class ViewHolder {
    @InjectView(R.id.title) TextView name;
    @InjectView(R.id.job_title) TextView jobTitle;
 
    public ViewHolder(View view) {
      ButterKnife.inject(this, view);
    }
  }
}

注入回调函数

下面是几种注入回调函数的方法示例:

// 带有 Button 参数
@OnClick(R.id.submit)
public void sayHi(Button button) {
  button.setText("Hello!");
}
 
// 不带参数
@OnClick(R.id.submit)
public void submit() {
  // TODO submit data to server...
}
 
// 同时注入多个 View 事件
@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();
  }
}

Reset函数

如果需要在 界面 销毁的时候,把注入的 View 设置为 Null, 则可以用 reset 函数:

public class FancyFragment extends Fragment {
  @InjectView(R.id.button1) Button button1;
  @InjectView(R.id.button2) Button button2;
 
  @Override View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fancy_fragment, container, false);
    ButterKnife.inject(this, view);
    // TODO Use "injected" views...
    return view;
  }
 
  @Override void onDestroyView() {
    super.onDestroyView();
    Views.reset(this);
  }
}

另外 还支持 可选的 View 注入,如果该 View 没有,就没有吧:

@Optional @InjectView(R.id.might_not_be_there) TextView mightNotBeThere;
 
@Optional @OnClick(R.id.maybe_missing) void onMaybeMissingClicked() {
  // TODO ...
}

还有两个 findViewById 函数来简化查找 View 的方式,如果上面都满足不了你的需求,你可以用用他们:

View view = LayoutInflater.from(context).inflate(R.layout.thing, null);
TextView firstName = Views.findById(view, R.id.first_name);
TextView lastName = Views.findById(view, R.id.last_name);
ImageView photo = Views.findById(view, R.id.photo);

最后,如果你是用Android Studio来作为IDE的话,那么有一个ButterKnife的插件android-butterknife-zelezny, 该插件可以让你手动生成上述注入代码,从此让自己成为一个更懒惰的程序员,上张截图吧。


转自:http://stormzhang.com/openandroid/android/2014/01/12/android-butterknife/


0
0
查看评论

ButterKnife--View注入框架---懒人必备

俗话说:“不会偷懒的程序员不是好的程序员!”。作为一名Android开发,是不是经常厌烦了大量的findViewById以及setOnClickListener代码,而ButterKnife是一个专注于Android系统的View注入框架,让你从此从这些烦人臃肿的代码中解脱出来。先来看一段代码示例说...
  • copy_yuan
  • copy_yuan
  • 2016-05-06 14:51
  • 570

View注入框架:Butterknife简单使用

我在网上找Butterknife的时候,发现很少,就去官网研究了一下,就写了Butterknife详解与大家分享,如果有什么问题,欢迎大家向我提出。
  • kun5069073
  • kun5069073
  • 2015-08-18 11:06
  • 1941

Android之---ButterKnife-View注入框架(简单介绍和在Studio中安装)

ButterKnife-View注入框架(简单介绍和在Studio中安装)
  • u010936731
  • u010936731
  • 2016-12-07 10:53
  • 698

Android Butterknife 8.4.0 ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListene

前言 ButterKnife 简介 ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。 项目github地址:https://github.com/JakeWh...
  • mazhidong
  • mazhidong
  • 2017-05-24 10:48
  • 213

玩转ButterKnife注入框架

在去年这个时候,我写过一篇介绍Android注解的文章android注解使用详解,这篇文章主要是介绍了Android中的AndroidAnnotations注入框架,AA框架有它自身的一些优点,这里不赘述,但是我总觉得和ButterKnife比起来来世有些差距,今天我们就来看看ButterKnife...
  • u012702547
  • u012702547
  • 2016-08-12 20:56
  • 4288

android依赖注入框架Dagger和Butterknife实战

依赖注入(DependencyInjection):在类A中要用到一个B的对象(依赖),需要通过新建B的实例或其他一些主动的方式来获取对象,然后才能调用。而通过外部的方式自动将B的对象分配给A(注入),实现相对被动的获取对象,这个过程称为依赖注入。   控制反转:对象在被创建的时候,由一个...
  • u012995514
  • u012995514
  • 2015-07-05 00:37
  • 3357

如何让自己专注于工作

1 像老板一样专注   作为一个一流的员工,不要只是停留在“为了工作而工作、单纯为了赚钱而工作”等层面上。而应该站在老板的立场上,用老板的标准来要求自己,像老板那样去专注工作,以实现自己的职场梦想与远大抱负!   以老板的心态对待工作,不做雇员,要做就做企业的主人,第一时间维护企业的形象   2 学...
  • God_need_you
  • God_need_you
  • 2010-08-07 09:11
  • 6056

Android Butterknife view注入框架使用

前言 ButterKnife 简介ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。项目github地址: https://github.com/JakeWharton/b...
  • jing__jie
  • jing__jie
  • 2017-08-01 14:35
  • 125

Android Butter Knife 框架——最好用的View注入

最近在看GitHub上的一些代码时,发现很多工程都用到了Butter Knife这个框架,能节省很多代码量。像findViewById这种代码就不用再出现了,而且这个框架也提供了很多其他有用的注解。 抱着学习的心态看了官网上的文档,挺简单,也很实用,决定以后就用这个库了。 下面是我翻译的官方文档...
  • u011506413
  • u011506413
  • 2016-03-18 23:54
  • 1681

Android ButterKnife依赖注入框架简单使用

Butter KnifeGithub:https://github.com/JakeWharton/butterknife通过注解的方式,将Android View与成员变量和方法绑定起来,为你形成一种模板样式的代码。 在成员变量上使用@BindView替换掉 findViewById; 快速操作一...
  • qq_33425116
  • qq_33425116
  • 2016-10-17 14:59
  • 575
    个人资料
    • 访问:18182次
    • 积分:404
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:12篇
    • 译文:0篇
    • 评论:1条
    文章存档
    最新评论