如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法

时间:2022-10-20 08:55:00

博主开发小白一个,第一次自己写博客,将最近做的项目遇到的问题总结一下,有遇到相同bug的可以参考参考。

今天老板要将之前写的一个商场APP嵌入到现在的项目中,好吧,老板最大,没办法,也只能开搞了.....   当开始做的时候,想的就是将项目转为library再导入当前的项目中,想到就做,马上就开搞,首先将build.gradle中如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法改成如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法  Sync Now,然后你会发现报错了,为什么呢 ,原来库文件不能有如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法,把这行删掉 再Sync Now就好了。这样就可以了吗?只能说你太天真了,这只是把项目转为library的第一步,接下来还需要将library文件导入到当前项目中。那么怎么导入呢 ,别急,听博主慢慢道来.首先选择new-> Import Module如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法,选择我们之前准备好的library,将library导入进来,导入进来后,发现没什么问题,然后你在主项目设置了点击跳转到library中写好的一个activity中,运行后,你会发现一片飘红,报错需要常量表达式.....what,这是什么情况,原来library中switch case分支后面跟着的必须是常量,换句话说出现这个问题的原因是Android library中生成的R.java中的资源ID不是常数,如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法,解决办法网上也很多,也就不说为什么会这样了(其实我也不太明白),只要把switch case改成if else 就行了如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法OK,这个bug解决,离成功又近了一步。想想还有点小激动\(^o^)/~。

如果绑定控件id用的是findviewbyid就不会报错,如果是用的Butterknife,那么恭喜你,也一样会报错需要常量表达式如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法那么这个问题该怎么解决呢,其实这个是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的标注的点击事件,点击后也没有反应。

解决方案

最后发现,只需修改一下上述步骤

[java]  view plain  copy
  1. buildscript {  
  2.     repositories {  
  3.         jcenter()  
  4.         mavenCentral()  
  5.     }  
  6.     dependencies {  
  7.         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // 添加的部分  
  8.         classpath 'com.jakewharton:butterknife-gradle-plugin:8.6.0'  
  9.     }  
  10.   
  11. }  

[java]  view plain  copy
  1. apply plugin: 'com.android.library'  
  2. apply plugin: 'com.jakewharton.butterknife'  
  3. apply plugin: 'android-apt'  
  4.   
  5. dependencies {  
  6.   compile 'com.jakewharton:butterknife:8.6.0'  
  7.   apt 'com.jakewharton:butterknife-compiler:8.6.0' // 修改的地方 把annotationProcessor改为apt  
  8. }  

这样处理之后,就正常了!好了,到这里基本就大功告成了。想想还是蛮简单的嘛,嗯,网上教程一堆,那么我为什么还要写这个呢,因为啊,博主运行后发现又报错了,这次报什么错呢,如何将一个项目转为library导入到另一个项目中以及遇到的坑和解决办法

找不到该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