美文网首页常用控件Android知识Android开发
Android ButterKnife(黄油刀)的使用

Android ButterKnife(黄油刀)的使用

作者: changer0 | 来源:发表于2016-10-17 11:59 被阅读2409次

    添加依赖

    ButterKnife Github地址

    虽然官网已经明确说明如何添加依赖, 我们还是做一下简单的介绍:

    step 1:

    配置工程下的build.gradle文件

    
    buildscript {
      repositories {
        mavenCentral()
       }
      dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
      }
    }
    
    

    step 2:

    配置Module下的build.gradle文件

    apply plugin: 'android-apt'
    
    android {
      ...
    }
    
    dependencies {
      compile 'com.jakewharton:butterknife:8.4.0'
      apt 'com.jakewharton:butterknife-compiler:8.4.0'
    }
    
    

    注意:

    1. 后面的版本号以github为准
    2. 注意不要忘记添加apply plugin: 'android-apt'

    简单使用

    Activity中的使用

    
    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...
      }
    }
    
    

    注:使用ButterKnife不能够使用private和static修饰成员变量

    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;
      }
    }
    
    

    获取资源文件

    
    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
      // ...
    }
    
    

    ViewHolder或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("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);
        }
      }
    }
    

    点击事件处理

    支持多个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();
      }
    }
    
    

    注: 方法通常也不能设置private和static

    ButterKnife的工作流程 (感谢bxbxbai)

    当你编译你的Android工程时,ButterKnife工程中 ButterKnifeProcessor 类的 process() 方法会执行以下操作:

    • 开始它会扫描Java代码中所有的ButterKnife注解 @Bind 、 @OnClick 、 @OnItemClicked 等
    • 当它发现一个类中含有任何一个注解时, ButterKnifeProcessor 会帮你生成一个Java类,名字类似 <className>$$ViewBinder ,这个新生成的类实现了 ViewBinder<T> 接口
    • 这个 ViewBinder 类中包含了所有对应的代码,比如 @Bind 注解对应 findViewById() , @OnClick 对应了 view.setOnClickListener() 等等
    • 最后当Activity启动 ButterKnife.bind(this) 执行时,ButterKnife会去加载对应的 ViewBinder 类调用它们的 bind() 方法

    ** 图解 **

    ButterKnife原理

    相关文章

      网友评论

      本文标题: Android ButterKnife(黄油刀)的使用

      本文链接:https://www.haomeiwen.com/subject/upmayttx.html