Android高效开发的ButterKnife view框架介绍

来源:深圳沃龙软件开发公司     2017-04-06

工具片

高效开发的ButterKnife

        Butterknife是JakeWharton大神写的一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,通过插件可视化一键生成。

先看一下Butterknife和传统的findViewById的区别


class ExampleActivity extends Activity {
  @BindView(R.id.title) TextView title;
  @BindView(R.id.subtitle) TextView subtitle;
  @BindView(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...
  }}

通过@BindView方法和一个view的id 去自动绑定layout中的View,减少大量代码。

那么Butterknife是如何工作的呢?


可能很多人都觉得ButterKnife在bind(this)方法执行的时候通过反射获取ExampleActivity中所有的带有@Bind注解的属性并且获得注解中的R.id.xxx值,最后还是通过反射拿到Activity.findViewById()方法获取View,并赋值给ExampleActivity中的某个属性。这是一个注解库的实现方式,比较原始,一个很大的缺点就是在Activity运行时大量使用反射会影响App的运行性能,造成卡顿以及生成很多临时Java对象更容易触发GC。ButterKnife显然没有使用这种方式,它用了Java Annotation Processing技术,就是在Java代码编译成Java字节码的时候就已经处理了@Bind、@OnClick(ButterKnife还支持很多其他的注解)这些注解。

所以在性能方面完全和原始方法一样。

Butterknife很强大,他不仅可以通过@BindView来绑定View,还有@BindBool@BindColor@BindDimen@BindDrawable@BindInt,@BindString来绑定你想绑定的res资源文件

class ExampleActivity extends Activity {
  @BindString(R.string.title) String title;
  @BindDrawable(R.drawable.graphic) Drawable graphic;
  @BindColor(R.color.red) int red; // int or ColorStateList field
  @BindDimen(R.dimen.spacer) Float spacer; // int (for pixel size) or float (for exact value) field
  // ...}

@OnClick( ) : 绑定控件点击事件

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

@OnClick( ) : 绑定控件多个view的点击事件

 @OnClick({R.id.button1,R.id.button2,R.id.button3})
 public void OnClick(View view) {
     switch(view.getId){
         case R.id.button1:
         // TODO ...
         break;
         case R.id.button2:
         // TODO ...
         break;
         ...
     }
  }

还可以在fragment中使用

public class FancyFragment extends Fragment {
  @BindView(R.id.button1) Button button1;
  @BindView(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;
  }}

亦可在adapater中使用

 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 {
    @BindView(R.id.title) TextView name;
    @BindView(R.id.job_title) TextView jobTitle;

    public ViewHolder(View view) {
      ButterKnife.bind(this, view);
    }
  }}

有关ButterKnife 的更多内容,请看github地址:https://github.com/JakeWharton/butterknife

使用 Android ButterKnife Zelezny 插件 可以一键生成@bindview 

http://blog.csdn.net/dreamlivemeng/article/details/51261170


本内容皆为 深圳沃龙软件开发公司 原创
如需转载,请注明文章出处和来源网址:http://www.wooolong.com/blog/8.html

全部评论

暂无评论

发表评论