安卓项目实战之ButterKnife8.8.1的详细使用

ButterKnife简介

ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤。是大神JakeWharton的力作,目前使用很广。最重要的一点,使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单。

ButterKnife优势

1、强大的View绑定和Click事件处理功能,简化代码,提升开发效率
2、方便的处理Adapter里的ViewHolder绑定问题
3、运行时不会影响APP效率,使用配置方便
4、代码清晰,可读性强

ButterKnife版本注意

ButterKinfe的注解标签因版本不同而有所变化:
8.0.0之前的Bind标签在8.0.0之后变成了BindView。
而8.7.0之后在依赖的library中的activity中绑定view时,要用R2.id.XXX,而不再是常用的R.id.XXX,如果是直接在应用的activity中使用,R和R2两者没什么区别。
Note:网上说使用R2是因为library中的R字段的id值不是final类型的, 但是你的应用module中确是final类型的,所以在自己的应用中使用R和R2区别不大个人认为。

ButterKnife使用注意

1.使用ButterKnife修饰的方法和控件,不能用private or static 修饰。 
  否则会报错:错误: @BindView fields must not be private or static 
2.在Activity 类中绑定:ButterKnife.bind(this);必须在setContentView();之后绑定,且父类bind绑定后,子类不需要再bind。
3.在非Activity 类(例如:Fragment、ViewHold)中绑定:ButterKnife.bind(this,view);这里的this不能替换成getActivity()。 
4.在Activity中不需要做解绑操作,在Fragment 中必须在onDestroyView()中做解绑操作。

ButterKnife的配置

1、如果你是直接在app中使用,只需在app的 build.gradle 中添加如下代码:

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

2、如果是在项目依赖的Library库中使用,那么按照GitHub上的配置会报错,参考博客https://blog.csdn.net/zyw0101/article/details/80399225的解决方案如下:
1.在Project的build.gradle文件中添加:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'  //添加这一行
    }
}

这里注意butterknife的版本,8.8.1如果用不了,降低版本至8.5.1才可以使用,具体参见上面博客地址。

2.在App的 build.gradle 中添加如下代码:

apply plugin: 'com.jakewharton.butterknife'

dependencies中添加:

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

注意:如果是组件化开发,在module工程里面必须引用(包括主app模块)

annotationProcessor 'com.jakewharton:butterknife-compiler:8.x.x'

不然会出现控件绑定失效,导致OnClick等这样的事件无法实现

ButterKnife的使用示例

1.在Activity中使用:ButterKnife.bind(this);

  • 由于每次使用都要在Activity中的onCreate绑定Activity,因此个人建议在项目的BaseActivity中完成绑定,子类继承即可
  • 必须在setContentView();之后绑定。

2.在Fragment中使用:ButterKnife.bind(this, view); 然后在onDestroyView回调中调用它的unbind方法进行Fragment解绑。
3.在ViewHolder中使用:ButterKnife.bind(this, view);
在Adapter的ViewHolder中使用,将ViewHolder加一个构造方法,在new ViewHolder的时候把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.绑定点击事件

   @OnClick({R.id.login_btn_login})
   public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.login_btn_login:

                break;
            default:
                break;
        }
    }

   // 单个组件点击事件的简洁写法,可以不带参数
   @OnClick(R2.id.button1 )   //给 button1 设置一个点击事件
    public void showToast(){
        Toast.makeText(this, "is a click", Toast.LENGTH_SHORT).show();
    }

5.ViewPager的监听:

@OnPageChange(R.id.viewpager)
public void onPageSelected(int position) {
        switch (position) {
            case 0:

                break;
            case 1:

                break;
        }
    }

ButterKnife的混淆配置

-keep class butterknife.** { *; } 
-dontwarn butterknife.internal.** 
-keep class **$$ViewBinder { *; } 

-keepclasseswithmembernames class * { 
    @butterknife.* <fields>; 
} 
-keepclasseswithmembernames class * { 
    @butterknife.* <methods>; 
}

使用ButterKnife插件进行一键初始化

打开android的plugins中心,搜索butterknife
在这里插入图片描述
点击browse repo,下载前两个插件都可以,一般下载评分高的即可。
在这里插入图片描述
下载完成后需重启AS,回到activity代码的setContentview处,右键布局文件名,注意一定要把光标停在布局文件名上
在这里插入图片描述
选择Generate,这时可以看到生成butterknife注解的选项,如果光标不放在布局文件名上,则看不到该选项。
在这里插入图片描述
点击生成butterknife注解
在这里插入图片描述
插件将布局文件中的所有id都加载出来了,还可以设置点击事件,点击confirm即可快速初始化控件,非常方便。

    @BindView(R.id.tv_test1)
    TextView tvTest1;
    @BindView(R.id.btn_test1)
    Button btnTest1;
    @BindView(R.id.et_test1)
    EditText etTest1;
    @BindView(R.id.lv_test1)
    ListView lvTest1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_butter_knife_test);
        ButterKnife.bind(this);
        tvTest1.setText("文本控件已被初始化");
        btnTest1.setText("按钮被初始化");

    }


    @OnClick(R.id.btn_test1)
    public void onViewClicked() {
        btnTest1.setText("我被点击了");
        tvTest1.setText("天若有情天亦老");
    } 

效果与手动注解一样,对于安卓开发工作者来说,这个插件确实是个神器,节省了大量初始化控件的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智玲君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值