ButterKnife是啥

一、ButterKnife是啥

注解中相对简单易懂的很不错的开源框架
1. 强大的View绑定和Click事件处理功能,简化代码,提升开发效率
2. 方便的处理Adaper里的ViewHolder绑定问题
3. 运行时不会影响app效率,使用配置方便
4. 代码清晰,可读性强

github开源地址:
https://github.com/JakeWharton/butterknife

二、使用步骤

2.1 添加插件

File -> Settings -> Plugins -> 搜索ButterKnife,找到Android ButterKnife Zeleany进行安装重启AndroidStudio

2.2 添加依赖

在对应module的build.gradle里面添加下面的依赖,重新编译就会自动下载

dependencies {
  compile 'com.jakewharton:butterknife:8.5.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}

注意和Dagger2配合使用需要注意把annotationProcessor改为apt。

2.3 在Activity中使用

2.3.1 使用插件

在R.layout.activity_main上面右击 选择Generate -> Generate ButterKnife injections,即可选择 生成view对应的注解,还支持ViewHolder和OnClick

2.3.2 手动

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

下面的代码把R.id.tv_test这个TextView定义了为tvTest,注意类型不能为static或者private

@BindView(R.id.tv_test)
TextView tvTest;
 
//当然写成一行也是可以
@BindView(R.id.tv_test) TextView tvTest;
  1. 点击事件

添加注解@OnClick(R.id.xx)即为点击方法,对应的View参数可有可无,如果有多个参数可以只加一个参数(例如onItemClick有四个参数,你可以只加一个int position的参数)。如果参数错误,编译的时候会报错。

@OnClick(R.id.bt_test)
public void onClick(View v) {
    tvTest.setText("被点击了...");
}

如果定义为指定的类型,将会自动转换

@OnClick(R.id.bt_test)
public void onClick(Button button) {
    tvTest.setText("被点击了...");
}

更多事件看下面的 三

2.4 在Fragment中使用

在Fragment中使用和在Activity中使用,只是有一点不一样:在获取View的时候,加多一个view参数把View绑定到ButterKnife就行了。

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.my_fragment, container, false);
    //这里需要加多一个参数view
    ButterKnife.bind(this, view);
    return view;
}

Fragment生命周期和activity有点不同,销毁的时候可以进行解绑

 
public class MyFragment extends Fragment {
 
    @BindView(R.id.bt_test)
    Button btTest;
 
    private Unbinder unbinder;
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.my_fragment, container, false);
        //绑定的时候返回了一个Unbinder对象
        unbinder = ButterKnife.bind(this, view);
        return view;
    }
 
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }
}

2.5 在Adapter ViewHolder中使用

把ViewHolder加一个构造方法,在new ViewHolder的时候把view传递进去。

static class ViewHolder {
    @BindView(R.id.tv_item_test)
    TextView tvItemTest;
    @BindView(R.id.bt_item_test)
    Button btItemTest;
    public ViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}

item里面Button控件的点击事件也可以使用注解@OnClick来实现,在适配器里面添加就行,如:

 
    //item的button的点击事件
    @OnClick(R.id.bt_item_test)
    void onClick(){
        Toast.makeText(context,"点击了按钮",Toast.LENGTH_SHORT).show();
 
    }
 
    static class ViewHolder {
        @BindView(R.id.tv_item_test)
        TextView tvItemTest;
        @BindView(R.id.bt_item_test)
        Button btItemTest;
        public ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }

注意: 如果item里面有Button等这些有点击的控件事件的,需要设置这些控件属性focusable为false

猜你喜欢

转载自www.cnblogs.com/liangxy/p/9105075.html