进过测试,按JakeWharton/butterknife: Bind Android views and callbacks to fields and methods.
点击打开链接的说明文档在app模块使用是没有问题的。
但是,我想在library中使用Butter Knife,按照GitHub上的说明,应该像@BindView(R2.id.tv_search)这样使用R2代替R来进行使用。这下出现问题了:
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.administrator.myapplication01/com.example.administrator.myapplication01.ButterKnifeTest2Activity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2346)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2398)
...
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:853)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.example.administrator.myapplication01.ButterKnifeTest2Activity.onCreate(ButterKnifeTest2Activity.java:57)
at android.app.Activity.performCreate(Activity.java:5226)
可能是我gradle版本原因,按照Github上的说明引入Butter Knife之后,编译都没问题,运行时发生空指针异常。经过多次尝试,找到了一种解决办法,我不确定是不是标准的,因为我的情况是app模块依赖mylibrary02模块,mylibrary02模块又依赖mylibrary03模块。下面是解决办法:
1.在项目gradle文件(注意是项目的,不是模块的)中,buildscript -> dependencies下添加:
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
2.然后在mylibrary03模块(这是我的项目中的最底层的依赖模块)的gradle文件中添加依赖:
compile 'com.jakewharton:butterknife:8.8.1'//implementation annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
并在该文件的头部apply plugin: 'com.android.library'的下面继续添加上:
apply plugin: 'com.jakewharton.butterknife'3.如果你想在mylibrary02模块中(我这里mylibrary02依赖mylibrary03模块)使用Butter Knife,需要同样在该模块的gradle中添上:
apply plugin: 'com.jakewharton.butterknife'
以及依赖:
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
4.如果你想在app模块中使用Butter Knife,则只需要添加上依赖:
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
如果在使用R2时出现找不到资源,可能需要Rebuild一下项目,不知道Build一下该模块或项目可不可行,反正我是不想在library中折腾这些了。