ButterKnife 8.1.0 入门详解

先不管他怎么用, 我们先把他弄到我们的项目里,自己学的时候费了很大的功夫,现在参考一些大神的文章,加上自己学习遇到的问题来记录一下:

1、在project的build.gradle中添加这么一句话

//依赖包的定义
dependencies {
     classpath 'com.android.tools.build:gradle:2.2.1'
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'//要添加的
    }

2、在app的build.gradle中进行配置

1)首先添加构建项目的类型

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

2)添加依赖

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'

    compile 'com.jakewharton:butterknife:8.1.0'   //加这样的一句
    apt 'com.jakewharton:butterknife-compiler:8.1.0'//添加这个
}

注意:

下面的是我从网上直接复制粘贴的,

compile ‘com.jakewharton:butterknife:8.0.1’
apt ‘com.jakewharton:butterknife-compiler:8.1.0’

这里一个是8.1.0一个是8.0.1要保证这两个一致,否则会报如下错的

Error:(24, 32) 错误: 找不到符号
符号: 方法 findRequiredViewAsType(Object,int,String,Class)
位置: 类型为Finder的变量 finder

解决ButterKnife 8.1的依赖问题

AS从2.3.3升级到3.0后如上配置会出现如下问题:Error:android-apt plugin is incompatible with the Android Gradle plugin. Please use ‘annotationProcessor’
解决办法参考博客https://blog.csdn.net/l403040463/article/details/79166342

3、配置好 “环境” 后就要使用了

注意:使用ButterKnife注解的属性和方法不能用private和static修饰,否则会报错的!!!

1、Activity中的简单实用

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.hello)
    TextView helloView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //这里要要注意了,一定要在setContentView之后
        ButterKnife.bind(this);
        helloView.setText("看看成功没!");
    }
}

2、如果是在Fragment中使用有一点不同要注意

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

Butter Knife提供了bind的几个重载,只要传入跟布局,便可以在任何对象中使用注解绑定。

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

    return view;
  }

  @Override public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
  }
}

3、在ListView和RecyclerView的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("哈哈");

    return view;
  }

  static class ViewHolder {
    @BindView(R.id.title) TextView name;

    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()函数

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

4、BufferKnife 自动生成插件安装:

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

这里写图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值