业务背景:
项目组件化的时,按业务分成独立的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有时会默认引用错的。