Butterknife的简单使用

Table of Contents

1. 准备

安装依赖

compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'

安装插件 Preferences -> Plugins,搜索 Android Butterknife Zelezny,点击 install

可能会出现的问题:

  • 提示 gradle 没有 annotationProcessor 方法(检查 gradle 版本,升级到 2.2.1+)

2. 使用

2.1 使用插件

在 layout 资源文件名上面右击,选择 Generate -> Generate ButterKnife injections(或者快捷键 control+enter),即可选择生成 view 对应的注解和 OnClick

2.2 手动

  1. 绑定 view
    @BindView(R.id.main_text1)
    TextView mainText1;
    @BindView(R.id.main_edit1)
    EditText mainEdit1;
    @BindView(R.id.main_button1)
    Button mainButton1;
  1. 点击事件
    @OnClick({R.id.main_text1,R.id.main_edit1,R.id.main_button1})
    public void click(View v) {
        switch (v.getId()){
            case R.id.main_text1:
                mainText1.setText("Text被点击了。。。");
                break;
            case R.id.main_edit1:
                mainText1.setText("Edit被点击了。。。");
                break;
            case R.id.main_button1:
                mainText1.setText("Button被点击了。。。");
                break;
        }
    }
  1. 绑定资源
    @BindString(R.string.title) String title;
    @BindDrawable(R.drawable.graphic) Drawable graphic;
    @BindColor(R.color.red) int red; // int 或 ColorStateList field
    @BindDimen(R.dimen.spacer) Float spacer; // int 或 float
  1. Fragment 中的使用 在 Fragment 中使用和在 Activity 中使用,只有一点不一样:在获取 View 的时候,加多一个 view 参数把 View 绑定到 ButterKnife 就行了。
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_my, container, false);
        unbinder = ButterKnife.bind(this, view);
        return view;
    }

在销毁的时候需要解绑

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
  1. Adapter ViewHolder 中的使用
    static class ViewHolder{
        @BindView(R.id.item_text1)
        TextView itemText1;
        public ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }

3. 注解列表

事件注解

名称 作用
@OnClick 点击事件
@OnCheckedChanged 选中,取消选中
@OnEditorAction 软键盘的功能键
@OnFocusChange 焦点改变
@OnItemClick item 被点击(注意这里有坑,如果 item 里面有 Button 等这些有点击的控件事件的,需要设置这些控件属性 focusable 为 false)
@OnItemLongClick item 长按(返回真可以拦截 onItemClick)
@OnItemSelected item 被选择事件
@OnLongClick 长按事件
@OnPageChange 页面改变事件
@OnTextChanged EditText 里面的文本变化事件
@OnTouch 触摸事件
@Optional 选择性注入,如果当前对象不存在,就会抛出一个异常,为了压制这个异常,可以在变量或者方法上加入一下注解,让注入变成选择性的,如果目标 View 存在,则注入, 不存在,则什么事情都不做

绑定注解

名称 作用
@BindViews 绑定多个 view id 为一个 view 的 list 变量
@BindView 绑定一个 view id 为一个 view 变量
@BindArray 绑定 string 里面 array 数组,@BindArray(R.array.city ) String[] citys ;
@BindBitmap 绑定图片资源为 Bitmap,@BindBitmap( R.mipmap.wifi ) Bitmap bitmap;
@BindBool 绑定真假 boolean
@BindColor 绑定 color,@BindColor(R.color.colorAccent) int black;
@BindDimen 绑定 Dimen,@BindDimen(R.dimen.borth_width) int mBorderWidth;
@BindDrawable 绑定 Drawable,@BindDrawable(R.drawable.test_pic) Drawable mTestPic;
@BindFloat 绑定 float
@BindInt 绑定 int
@BindString 绑定一个 String id 为一个 String 变量,@BindString( R.string.app_name ) String meg;