ButterKnife 8.8.1 使用方法详解

ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。之前就一直在使用,但是没有整理文档,今天在使用时候遇到点问题,就抽出点时间顺便整理记录一下。

配置
在Android Studio项目中配置使用ButterKnife
本文介绍使用的AS版本为3.4.2,ButterKnife版本为8.8.1
1.如果你是直接在app中使用,只需在app的 build.gradle 中添加如下代码:

dependencies {
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

 安装插件

 File->Settings->Plugins   选择完,按如下图所示操作:

  

按照图上1-4步骤操作,找到Android ButterKnife Zelezny ,然后点击下面的Install后自动安装,安装完重启AndroidStudio后生效。

使用时,在Activity里先选中布局文件名称,如activity_main->单机鼠标右键,然后点击Generate->Generate ButterKnife Injections ,如下图操作:

 

 

 

 以上就是ButterKnife的插件安装,配置以及使用。

ButterKnife使用的注意事项:

1、在Activity 类中绑定 :ButterKnife.bind(this);必须在setContentView();之后绑定;且父类bind绑定后,子类不需要再bind。

2、在非Activity 类(eg:Fragment、ViewHold)中绑定: ButterKnife.bind(this,view);这里的this不能替换成getActivity()。

3、在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。

4、使用ButterKnife修饰的方法和控件,不能用private or static 修饰,否则会报错。错误: @BindView fields must not be private or static.

 在Activity中绑定ButterKnife:

必须要在setContentView之后绑定。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //绑定初始化ButterKnife
        ButterKnife.bind(this);
    }

在Fragment中绑定ButterKnife:

在onCreateView中绑定,在onDestroyView中进行解绑。

public class ButterknifeFragment extends Fragment{  
    private Unbinder unbinder;  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
                             Bundle savedInstanceState) {  
        View view = inflater.inflate(R.layout.fragment, container, false);  
        //返回一个Unbinder值(进行解绑),注意这里的this不能使用getActivity()  
        unbinder = ButterKnife.bind(this, view);  
        return view;  
    }  

    /** 
     * onDestroyView中进行解绑操作 
     */  
    @Override  
    public void onDestroyView() {  
        super.onDestroyView();  
        unbinder.unbind();  
    }  
}  

 在Adapter中绑定ButterKnife:

在Adapter的ViewHolder中使用,将ViewHolder加一个构造方法,在new ViewHolder的时候把view传递进去。使用ButterKnife.bind(this, view)进行绑定,代码如下:

public class MyAdapter extends BaseAdapter {  

  @Override   
  public View getView(int position, View view, ViewGroup parent) {  
    ViewHolder holder;  
    if (view == null) {
      view = inflater.inflate(R.layout.testlayout, parent, false);  
      holder = new ViewHolder(view);  
      view.setTag(holder);    
    } else {  
       holder = (ViewHolder) view.getTag(); 
    }  

    holder.name.setText("ButterKnife");  
    holder.age.setText("18");
    return view;  
  }  

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

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

 控件绑定

    @BindView(R.id.btn_test)
    Button btn_test;
    @BindView(R.id.img_header)
    CircleImageView imgHeader;
    @BindView(R.id.tv_UserName)
    TextView tvUserName;
    @BindView(R.id.tv_task)
    TextView tvTask;
    @BindView(R.id.rl_TodayTask)
    RelativeLayout rlTodayTask;

指定多个ID绑定事件

@OnClick({R.id.img_header, R.id.rl_TodayTask, R.id.rl_AssignedTasks, R.id.rl_OrderManagement, R.id.rl_RepairManagement, R.id.rl_ExceptionManagement, R.id.rl_WarningManagement})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.img_header:
                Toaster.show("个人中心");
                break;
            case R.id.rl_TodayTask:
                Toaster.show("今日任务");
                break;
            case R.id.rl_AssignedTasks:
                Toaster.show("指派任务");
                break;
            case R.id.rl_OrderManagement:
                Toaster.show("工单管理");
                break;
            case R.id.rl_RepairManagement:
                Toaster.show("维修管理");
                break;
            case R.id.rl_ExceptionManagement:
                Toaster.show("异常管理");
                break;
            case R.id.rl_WarningManagement:
                Toaster.show("预警管理");
                break;
        }
    }

ButterKnife使用findById:

 Butter Knife仍然包含了findById()方法,用于仍需从一个view ,Activity,或者Dialog上初始化view的时候,并且它可以自动转换类型。

View view = LayoutInflater.from(context).inflate(R.layout.test, null);  
TextView tv_Name = ButterKnife.findById(view, R.id.tv_Name);  
TextView tv_Age = ButterKnife.findById(view, R.id.tv_Age);  
ImageView img = ButterKnife.findById(view, R.id.img);  

 绑定注解:

@BindView—->绑定一个view;

@BindViews —-> 绑定多个view;

@BindArray—-> 绑定string里面array数组;@BindArray(R.array.city ) String[] citys ;

@BindBitmap—->绑定图片资源为Bitmap;@BindBitmap( R.mipmap.loading ) Bitmap bitmap;

@BindBool —->绑定boolean值

@BindColor —->绑定color;@BindColor(R.color.black) 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 appName;

事件注解: 

@OnClick—->点击事件

@OnCheckedChanged —->选中,取消选中

@OnEditorAction —->软键盘的功能键

@OnFocusChange —->焦点改变

@OnItemClick item—->被点击(注意这里有坑,如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false)

@OnItemLongClick item—->长按(返回真可以拦截onItemClick)

@OnItemSelected —->item被选择事件

@OnLongClick —->长按事件

@OnPageChange —->页面改变事件

@OnTextChanged —->EditText里面的文本变化事件

@OnTouch —->触摸事件

 以上就是ButterKnife的简单使用

参考文档:

https://blog.csdn.net/zyw0101/article/details/80399225

https://www.jianshu.com/p/3678aafdabc7

发布了92 篇原创文章 · 获赞 38 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/u013184970/article/details/101511037
今日推荐