学习完注解,再来探索下ButterKnife的实现原理

1. 简介

分析完Java中的反射(有关Java反射的使用看这一篇就够了)和注解(Java注解全面总结),如果就这样结束了,总感觉缺少了些什么,不拿一个开源库来分析分析,然后动手实践一遍,怎么能体会到反射和注解的博大精深呢。于是想到了Android中的一个开源库ButterKnife,用法简单,为我们减少了大量垃圾代码(例如findViewById)。本篇文章首先从ButterKnife的基本用法入手,然后着手分析ButterKnife的实现原理,最后自己动手撸一把,实现最简单的替换findViewById功能,能看到开源库并不代表就会了,只有自己动手实现一遍,才能够真正掌握,希望阅读完本篇文章,能够给大家一定的技术提升。

2. 基本用法

本篇文章重点在于ButterKnife的源码分析和动手实践,只是简单介绍下最基本用法,对于更多的用法细节,不在讨论范围内。

     2.1 ButterKnife项目地址

https://github.com/JakeWharton/butterknife

     2.2 基本配置

百度相关文章,看到很多博客在写AS配置ButterKnife的时候,都说首先需要在Project 的 build.gradle中添加相关代码,然后在APP的build.gradle中添加 apply plugin ……, 最后在dependencies中添加相关依赖等等,其实并非如此,虽然这样配置是不影响最终的结果的,但还是有些多余,或者说对于Module是application和Module是library,两者的配置是有些不一样的,可以参考官方文档。

        1) Module为application的配置

如果你仅仅是在Module为application的模块下使用ButterKnife,那么配置非常简单,只需要在Module下的build.gradle文件中添加如下代码即可:

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

         2) Module为library的配置

如果你的Module为library,配置稍微复杂一点,其实也非常简单,首先在Project下的build.gradle添加如下代码:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        ............
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
    }
}

在library的build.gradle文件中添加如下代码:

扫描二维码关注公众号,回复: 3190901 查看本文章
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'    // 新增
dependencies {
    ..................
    compile 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

     2.3 基本使用

ButterKnife的使用十分简单,只是在Module是application和Module是library稍有不同,下面为Module是application的最简单使用方式:

public class ButterKnifeTestActivity extends AppCompatActivity {

    @BindView(R.id.tv_show_info)
    TextView tvInfo;

    public static void startActivity(Context context){
        Intent intent = new Intent(context, ButterKnifeTestActivity.class);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_butter_knife_test);

        //绑定初始化ButterKnife
        ButterKnife.bind(this);

        initView();

    }

    private void initView(){
        tvInfo.setText("测试信息");
    }
}

布局文件非常简单,此处就省略了,当进入该activity,textview显示的信息为 测试信息。如果Module是library的情况,需要将@BindView(R.id.tv_show_info) 中的R 修改为 R2即可,官方文档也有相关说明。

未完待续。。。

猜你喜欢

转载自blog.csdn.net/u010349644/article/details/82694950
今日推荐