ButtonKnife在library报“Attribute value must be constant”

业务背景:

项目组件化的时,按业务分成独立的module,把一个完整模块设置成library,设置成library时候原先的buttonknife绑定view的代码全部标红下划线,提示“Attribute value must be constant,以下是解决方案:

1、在build.gradel(Project: xxxx)的dependencies中添加:

dependencies {
 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
 classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
 }

2、build.gradel(Moudle: app)  library如:(build.gradel(Moudle: xxxx))中添加:

apply plugin: 'com.jakewharton.butterknife'
apply plugin: 'android-apt'
dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0' 
}

3、在library绑定view如下(用R2代替R):

@BindView(R2.tv_account) 

TextView tvAccount;

4、在onClick的方法中:

@OnClick({R2.id.apply1,R2.id.apply2})
public void onClick(View view) {
    if(view.getId() == R.id.apply1){
    }else if(view.getId() == R.id.apply2){
    }
}
此处不可用switch case的语法,并且里面是R.id.apply1和R2.id.apply不要用混了切记切记。
5、一些地方,不可以用注解找到控件,如弹出框。需要使用findviewbyid的时候:
TextView textview1 = (TextView)viewxxx.findviewByid(R.id.xxxx);此处用R,用R2会找不到。对控件进行处理的时候,需要用4中的方法。

6、依赖的module如果不止一个,就有可能会出现使用myApplicaiton的配置冲突,这个时候error log会提醒你配置:

tools:replace="android:name"
我建议:千万不要这么做!
这句代码的意思是,配置了多个,打包的时候多个module会封装成一个,但是有多个冲突,默认就会用最先依赖的包的myapplication为主,这样就会造成隐藏的问题,就是后来那个全局配置失效,这就可能含有隐藏的bug,开始并不一定会出现,但是遇到了,就要么项目重构,要么换代码内方法。很痛苦!

7、尽量不要出现相同的id,否则可能会有想不到的bug。(小白选手)不同module包之间不得以依赖同一个的module的时候,尽量不要在这个module中放界面,只放一些公共的方法,因为依赖xml的时候,就有可能出现id挂了。(id挂了,我也是醉了,我最后项目重构了。)依赖同一个module的原因就是,为了解决⑥中有全局环境变量。

8、R2怎么都不出现,clean多次、Rebuild多次也没有,可以复查下你class文件中 import 的R、R2文件是否正确。Android Studio有时会默认引用错的。

 

发布了56 篇原创文章 · 获赞 12 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/huwan12345/article/details/77976533