BufferKnife详解

buffterKnife这个框架之前在项目中一直在用,但是没写成属于自己的博客,今天看到一篇不错的相关的文章,介绍的比较全面,转载记录下顺带学习温故下;

转载于:https://blog.youkuaiyun.com/qq_31214937/article/details/52605794

BuffterKnife是一个专注于Android系统的View、Resource、Action注入框架。

    官网:http://jakewharton.github.io/butterknife/

    gitHub:https://github.com/JakeWharton/butterknife/

ButterKnife 优势

· 强大的View绑定和Click事件处理功能,简化代码,提升开发效率

· 方便的处理Adapter里的ViewHolder绑定问题

· 运行时不会影响APP效率,使用配置方便

· 代码清晰,可读性强

BufferKnife 如何使用:

   1.)在Project的build.gradle中添加如下配置

 

buildscript {

  repositories {

    mavenCentral()

   }

  dependencies {

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

  }

}

 

2.)在Module的build.gradle添加如下配置

 

apply plugin: 'com.neenbedankt.android-apt'

 

android {

  ...

}

 

dependencies {

  compile 'com.jakewharton:butterknife:8.1.0'

  apt 'com.jakewharton:butterknife-compiler:8.1.0'

}

 

3.)注入和重置注入

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

}

Fragment:由于不同的视图生命周期,所以需要在onCreateView bind,在onDestroyView unbind

 

public class FancyFragment extends Fragment {

  @BindView(R.id.button1) Button button1;

  @BindView(R.id.button2) Button button2;

  private Unbinder unbinder;

 

  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fancy_fragment, container, false);

    unbinder = ButterKnife.bind(this, view);

    // TODO Use fields...

    return view;

  }

 

  @Override public void onDestroyView() {

    super.onDestroyView();

    unbinder.unbind();

  }

}

 

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 {

    @BindView(R.id.title) TextView name;

    @BindView(R.id.job_title) TextView jobTitle;

 

    public ViewHolder(View view) {

      ButterKnife.bind(this, view);

    }

  }

}

 

4.)view注入 @BindView,@BindViews

    @BindView(R.id.btn_butter_knife)

    Button butterKnifeBtn;

    @BindViews({R.id.tv_butter_knife1,R.id.tv_butter_knife2,R.id.tv_butter_knife3})

    List<TextView> textViews;

5.)Resource注入

 

    @BindString(R.string.title_btn_butter_knife)

    String butterKnifeStr;//string注解使用    @BindDrawable(R.mipmap.ic_launcher)

    Drawable butterKnifeDrawable;//Drawable注解使用    @BindBitmap(R.mipmap.ic_launcher)

    Bitmap  butterKnifeBitmap;;//Bitmap注解使用    @BindArray(R.array.day_of_week)

    String weeks[];//数组    @BindColor(R.color.colorPrimary)

    int colorPrimary;//color注解使用    @BindDimen(R.dimen.activity_horizontal_margin)

    Float spacer;

 

6.)单事件注入

一个控件指定一个事件回调

 

    /**

     * 带参数

     */

    @OnClick(R.id.btn_butter_knife)

    public void onButterKnifeBtnClick() {

    }

 

    /**

     * 带参数

     */

    @OnClick(R.id.btn_butter_knife)

    public void onButterKnifeBtnClick(View view) {

        Log.e(TAG, "onButterKnifeBtnClick");

    }

 

    /**

     * 带参数

     * @param button

     */

    @OnClick(R.id.btn_butter_knife)

    public void onButterKnifeBtnClick(Button button) {

        Log.e(TAG, "onButterKnifeBtnClick");

    }

 

也可以多个控件指定一个事件回调

 

    /**

     * 两个不同的button都相应onButterKnifeBtnClick事件回调

     *

     * @param button

     */

    @OnClick({R.id.btn_butter_knife, R.id.btn_butter_knife1})

    public void onButterKnifeBtnClick(Button button) {

        Log.e(TAG, "onButterKnifeBtnClick");

    }

 

自定义的控件不通过ID也可以绑定到自己的事件

public class FancyButton extends Button {

  @OnClick

  public void onClick() {

    // TODO do something!  }

}

7.)多事件回调

有一些View的listener是有多个回调方法的,比如EditText添加addTextChangedListener

 

 editText.addTextChangedListener(new TextWatcher() {

            @Override

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

 

            }

 

            @Override

            public void onTextChanged(CharSequence s, int start, int before, int count) {

 

            }

 

            @Override

            public void afterTextChanged(Editable s) {

 

            }

        });

 

可以使用注解方式改成如下

 

    @OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.BEFORE_TEXT_CHANGED)

    void beforeTextChanged(CharSequence s, int start, int count, int after) {

 

    }

    @OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.TEXT_CHANGED)

    void onTextChanged(CharSequence s, int start, int before, int count) {

 

    }

    @OnTextChanged(value = R.id.nameEditText, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)

    void afterTextChanged(Editable s) {

 

    }

 

8.)选择性注入

默认情况下,@Bind 和listener的注入都是必须的,如果target view没有被发现,则会报错. 为了抑制这种行为,可以用@Optional注解来标记field和方法,让注入变成选择性的,如果targetView存在,则注入, 不存在,则什么事情都不做.或者使用 Android's "support-annotations" library.中的@Nullable来修饰

 

@Nullable @BindView(R.id.might_not_be_there)
TextView mightNotBeThere;

 

@Optional @OnClick(R.id.maybe_missing)
void onMaybeMissingClicked() {

  // TODO ...

}

 

9.)ButterKnife.apply()函数

  可以通过ButterKnifeapply()函数对view集合元素或者单个view的Action, Setter和Property进行修改

 

ButterKnife.apply(nameViews, DISABLE);

ButterKnife.apply(nameViews, ENABLED, false);

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

  }

};

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

 

10.)ButterKnife.findById()

     ButterKnife 也提供了findById函数,通过findById()可以获取Activity、Dialog、View中的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);

BufferKnife 自动生成插件安装:

   在AndroidStudio->File->Settings->Plugins->搜索Zelezny下载添加就行 ,可以快速生成对应组件的实例对象,不用手动写。使用时,在要导入注解的Activity 或 Fragment 或 ViewHolder的layout资源代码上,右键——>Generate——Generate ButterKnife Injections,然后就出现如图的选择框。

 插件gitHub地址:https://github.com/avast/android-butterknife-zelezny

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值