博主开发小白一个,第一次自己写博客,将最近做的项目遇到的问题总结一下,有遇到相同bug的可以参考参考。
今天老板要将之前写的一个商场APP嵌入到现在的项目中,好吧,老板最大,没办法,也只能开搞了..... 当开始做的时候,想的就是将项目转为library再导入当前的项目中,想到就做,马上就开搞,首先将build.gradle中改成 Sync Now,然后你会发现报错了,为什么呢 ,原来库文件不能有,把这行删掉 再Sync Now就好了。这样就可以了吗?只能说你太天真了,这只是把项目转为library的第一步,接下来还需要将library文件导入到当前项目中。那么怎么导入呢 ,别急,听博主慢慢道来.首先选择new-> Import Module,选择我们之前准备好的library,将library导入进来,导入进来后,发现没什么问题,然后你在主项目设置了点击跳转到library中写好的一个activity中,运行后,你会发现一片飘红,报错需要常量表达式.....what,这是什么情况,原来library中switch case分支后面跟着的必须是常量,换句话说出现这个问题的原因是Android library中生成的R.java中的资源ID不是常数,,解决办法网上也很多,也就不说为什么会这样了(其实我也不太明白),只要把switch case改成if else 就行了,OK,这个bug解决,离成功又近了一步。想想还有点小激动\(^o^)/~。
如果绑定控件id用的是findviewbyid就不会报错,如果是用的Butterknife,那么恭喜你,也一样会报错需要常量表达式,那么这个问题该怎么解决呢,其实这个是Butterknife的一个bug,在8.4.0版本已经解决了,当然,博主现在使用的版本已经是最新版的8.6.0了。那么我们先按Butterknife官网给的解决方案试一下。
Library projects
To use Butter Knife in a library, add the plugin to your buildscript
:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.6.0'
}
}
and then apply it in your module:
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
Now make sure you use R2
instead of R
inside all Butter Knife annotations.
class ExampleActivity extends Activity { @BindView(R2.id.user) EditText username; @BindView(R2.id.pass) EditText password; ... }嗯,运行一下,按照这个步骤操作后并没有效果,用@BindView的地方提示NullPointerException,用@onClick的标注的点击事件,点击后也没有反应。
解决方案
最后发现,只需修改一下上述步骤
这样处理之后,就正常了!好了,到这里基本就大功告成了。想想还是蛮简单的嘛,嗯,网上教程一堆,那么我为什么还要写这个呢,因为啊,博主运行后发现又报错了,这次报什么错呢,
找不到该id,why??不是已经都绑定好了吗,编译也没报错啊,这又是什么情况。好吧,不明白的只能去找度娘了,找了一圈,也没发现有说这是什么问题的(不知道是不是我找问题的姿势不对,没找到/(ㄒoㄒ)/~~),没办法,博主只能自己解决了。排查了一下,通过Ctrl+shift+F查找全局将整个项目查找了一遍后发现R文件中怎么有两个不同的id,又发现library中res的layout 、图片资源等很多都与主项目同名,于是博主就想,问题会不会就出在这里,果然,博主将报错的activity绑定的layout的名称改了(PS:如果主项目中有activity绑定的layout与library中的layout同名,修改library的layout名称,主项目中的activity绑定的layout会跟着变,需要注意改回来,不然还是得报错),重新运行一下,OK,这下终于大功告成了。不容易啊,这个坑,困扰了博主好久,头发都拔掉了好几根/(ㄒoㄒ)/~~。总结发现原来如果主项目和library中如果资源文件有同名的情况下,Android会自动引用主项目中的资源id,导致程序报错。在此分享给遇到同样bug又不知道怎么解决的人,希望对你们有帮助!!最后提一句:主项目中的build.grade中的minSdkVersion和argetSdkVersion需要与library中的一致才可以哦。。
PS:如果要将项目作为library导入另一个项目,library中的res资源名称最好不要与主项目的一样,不然后面有得改,博主就是踩了一个大坑,望大家以此为戒哈。
本文参考了:http://blog.csdn.net/luoguopeng/article/details/72582904