目录(?)[-]

  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开发相关文章

【转】 Pro Android学习笔记(八六):了解Package(5):使用lib的更多相关文章

  1. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  2. 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST

    目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...

  3. 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

    目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...

  4. 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限

    目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID ...

  5. 【转】 Pro Android学习笔记(六三):Preferences(7):代码控制首选项

    [-] 代码实现preference 利用preference保存状态 DialogPreference 代码实现preference View可以不通过xml进行设置,有代码直接进行设置,首选项pr ...

  6. 【转】 Pro Android学习笔记(六二):Preferences(6):header

    目录(?)[-] 代码实现 header xml文件 在前面的例子,我们主要学习了PreferenceScreen的xml如何写,preference有哪些类型.在代码中,我们为了不提示warning ...

  7. 【转】 Pro Android学习笔记(六十):Preferences(4):MultiSelect List Preference

    目录(?)[-] XML文件 在设备中保存 读出信息 ListPreference提供单选列表,我们可以通过CheckBoxPreference提供多选列表.此外,Android在3.0后提供Mult ...

  8. 【转】 Pro Android学习笔记(六四):安全和权限(1):签发apk

    目录(?)[-] Android安全模型 数字证书签发 Debug的keystore 生产unsigned的apk 为apk进行证书签发 align安装包 使用Export Wizard生成签发的ap ...

  9. 【转】Pro Android学习笔记(六):了解Content Provider(中)

    Content Provider的架构 Authority类似web中的域名,每个content provider会通过AndroidManifest.xml向系统注册authority,如下.其中n ...

  10. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

随机推荐

  1. EXP-00008:遇到ORACLE错误904问题

    案例情景--在一次Oracle 数据库导出时: C:\Documents and Settings\Administrator>exp lsxy/lsxy@lsxy_db file=E:\lsx ...

  2. mongodb count 导致不正确的数量(mongodb count 一个坑)

    在mongodb 集群中,if  存在orphaned documents 和chunk migration, count查询可能会导致一个不正确的查询结果,例如我就是踩的这个坑,先不说话,看结果: ...

  3. 九度oj-题目1103:二次方程计算器

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2799 解决:633 题目描述: 设计一个二次方程计算器 输入: 每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式. 输 ...

  4. wampserver安装在服务器中,但是mysql不能远程登录的解决方案

    利用mysql workbench或者Navicat连接服务器的mysql时,有时候会出现拒绝访问, 因为在mysql中没有赋予其他用户权限,只能本地登录,所以要进行设置. 设置如下: 打开mysql ...

  5. Javascript中一些常用的宽与高

    在使用javascript制作一些网络特效时,往往要根据显示网页的显示器的一些参数展开进行.所以一些关于显示器的参数如何得到显得十分重要.下面是一些常用的显示器参数,不妨好好记一下吧! 网页可见区域宽 ...

  6. poj2442优先队列

    感谢 http://hi.baidu.com/%C0%B6%C9%ABarch/blog/item/f9d343f49cd92e53d7887d73.html 的博主! 思路: 我们要找到n个smal ...

  7. HIVE HSQL 基本操作命令

    创建表: hive>create table tablename(id int,name string,password string); 创建一个名字为tablename的表,表的属性有int ...

  8. 透透彻彻IoC

    本文转载自:http://stamen.iteye.com/blog/1489223/ 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP.声明式事务等功能 ...

  9. 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它

    dpkg应用程序被占用 错误提示: E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他 ...

  10. T-SQL_面试题

    创建表插入数据 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname ...