目录(?)[-]

  1. 在项目中使用lib
  2. 源代码
  3. 了解一些机制

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/

在上一次学习中,我们创建的lib项目TestLib,本次学习,我们将学习如何在项目中调用lib。我们创新了一个普通的App项目,名字为TestUseLib。

在项目中使用lib

要在项目中使用lib,需要加入lib。在Eclipse中点击项目名按右键,选择Properties,将lib项目加入,如图所示,我们加入了之前创建的lib:TestLib。

源代码

package cn.flowingflying.androidtest.testuselib;

import cn.flowingflying.androidtest.testlib.*;  //为调用lib的类而加入 
…… 
public class MainActivity extends Activity { 
    … … 
   /* 下面实现按某菜单,调用来自lib的Acitivity,在代码上和普通调用没有区别 */
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
        if(item.getItemId() == R.id.menu_library_activity){ 
            invokeLibActivity(); 
            return true; 
        } 
        return super.onOptionsItemSelected(item); 
    }

private void invokeLibActivity(){ 
        Intent intent = new Intent(this,TestLibActivity.class); 
        startActivity(intent); 
    }        
       
}

了解一些机制

我们来看看TestUseLib项目结构,发现在Android Dependencies中引入了testlib.jar,这说明不是将lib项目的源代码直接引入,而是将lib项目编译成jar包引用,这样,每次App项目编译时,就无需重新编译lib的源代码,加快了编译速度。

但是,使用jar包方式也会引发一些问题。在App项目中R.java的资源id是public staticfinal int。如果lib项目也是如此,那么在编译成jar的时候,具体的int的数字会编译进去,就有可能导致App项目和lib项目中资源id的数值相同,而Android项目要求资源Id都是唯一的。为了解决这个问题,lib项目的资源id是public static int,没有final,在编译成jar包时,并没有包含这个R.class,在使用时,相关的数值依赖于App项目中重写的该lib包的R.java。

在lib项目中,由于资源id不再是常量,在lib项目中我们就不能使用如下的代码:

// 下面是错误的,因为在lib中资源ID不是一个常量,不能在case中使用 
switch(item.getItemId()){ 
case R.id.menu_clear: //编译出错 
    ……   
    break; 
default: 
    break; 
}

在App项目中,重写Lib项目的R.java,而这个新的R.java中资源id是public staticfinal int,也就是在App项目中,可以使用上述的代码。

在lib和app项目中,可能会出现资源名字冲突,例如,在lib和app项目都分别对TextView命名为R.id.text1,这是没有问题的,因为他们分属于不同包,有package namespace进行了区分,实际名字分别是<lib-package-name>.R.id.text1和<app-package-name>.R.id.text1。在编译过程中,app的优先于lib的,如果要用lib的,可以在前面加上包名,给出完整名字。当然为了避免错误引用,作为lib项目,应该在资源命名时有所区别,包括layout文件名,xml文件名,例如定义为R.id.lib_text1,R.id.testlib_text1。

相关小例子源代码可在Pro Android学习:了解package的小例子中下载。

相关链接: 我的Android开发相关文章

最新文章

  1. 【Linux_Fedora_应用系列】_5_如何安装XZ Utils 解压缩工具以及利用 xz工具来解压缩.xz文件
  2. 【Win10 UWP】QQ SDK(一):SDK基本使用方法
  3. WebService之Axis2(4):二进制文件传输
  4. M2的来源很简单
  5. struts2,hibernate4,spring3配置时问题汇总及解决办法
  6. xml学习总结(一)
  7. 【转】如何在Mac上撰寫C++程式
  8. 微软在线测试题String reorder
  9. 背包问题--nyoj题目106
  10. 5.7.13mysql 无法登陆
  11. Win8.1系统下配置搭建IIS8.5+PHP5.5.4运行环境
  12. 百度鹰眼Java接口调用增删改查实例
  13. Xshell5下利用sftp上传下载传输文件
  14. Linux System Programming --Chapter Seven
  15. Java小问题
  16. Javascript 对象 - 数组对象
  17. 百度前端代码规范:CSS
  18. Go Revel - i18n(国际化)
  19. linux 压缩和解压命令
  20. 深入理解Linux内核-页高速缓存

热门文章

  1. Vue.js学习笔记 第五篇 事件处理
  2. 在Visual Studio中使用VueJS时,不可以用 v-bind 的简写 : 及 v-on的简写 @
  3. C语言一个细节地方的说明【防止使用不当而出错】
  4. 常用java开发工具快捷键
  5. maven 内置属性有哪些?该如何使用?
  6. UOJ283 直径拆除鸡
  7. matlab *与.*的区别
  8. CSS3中的变形功能
  9. Js的cookie
  10. php:使用XHProf查找PHP性能瓶颈