一个简单的Android Library Project例子

一、何谓Library Project:

关于Library Project的官方详细解释可以参考这里,对英语不感冒的同学,可以参考我的简单解释:如果有一部分代码被多个工程共享了,那么这个时候把它做成库来加载,是最好的选择。在Java中,我们一般采用Jar包的形式提供库文件,但是在Android开发中,官方并不赞成打包为Jar包的方式,虽然在网上可以搜到一些“旁门左道”把资源打包成Jar包。而个人感觉Library Project的一个最大缺点就是库工程文件是展开的,这样工程文件“可以修改而不是只读”。

*说明:本文中的操作均利用Eclipse with ADT实现的。

二、如何创建Library Project:

Library Project和Standard Project的创建方式是一样——均是新建一个Android Project。
在创建工程的时候,要注意,如果库工程中有 <activity>、 <service>、<receiver>或者 <provider>等,在用户工程的manifest.xml文件中均需要有专门的声明,详见官方说明。

工程创建完毕以后,打开工程的属性配置,并选择到Android一项中,勾选“is library”:
然后,再创建(或者选中已有的)一个用户工程,同样选择工程属性,然后在Library面板中添加刚才的库工程:
整个添加过程就结束了。这里有一个疑难杂症提醒一下大家:如果在你完成了上诉步骤以后,发现在用户工程中仍然无法正常索引库工程的内容,Eclipse的自动补全系统也不能帮你添加import,甚至你手动添加了import都还是不能识别,那么,尝试重启一下你的Eclipse吧。

三、针对 Library Project的一些讨论:

1. 库文件需要Activity么?

从功能上讲,Android官方为大家提供了为库工程添加一切类型的可能性,然而这并不意味着我们就一定要这么做。

例如在我这次写的工程中,库工程的主要作用就是提供一个LinearLayout对象,里面躺着我的签名板。于是我有两个选择:1、提供一个LinearLayout对象;2、提供一个Activity对象。

通常情况下,我们会发现,采用前一种方法会令库工程更加灵活,因为如果提供一个Activity,就意味着我们必须提供它一些修饰信息:是否全屏,大小,配色以及Intent的读取和写入。这些都是与用户工程息息相关的,而对于签名板来说,则是多余的。

然而,如果我们提供的功能是类似于“弹出警告框”,那么或许提供一个直接的Activity会比较方便,虽然在配色方面极有可能与用户工程格格不入,但是作为一个简单的弹出框,它的影响是有限的。(想想平时我们用的各种绚丽的桌面应用,它们的报错框往往采用的是window默认提供的样式。)

2、如何让界面大小更加灵活(上)?

在我提供的例子中,需要为WhiteBoard的构造函数提供签名板的长宽。这个细节值得大家注意,它也消耗了我很多时间来研究相关的函数和逻辑。

首先,我们能想到的,这两个长宽的提供一定与承载它的界面大小相关,所以我们需要读取父控件的长宽:

final LinearLayout layout = (LinearLayout) this.findViewById(R.id.lv_main);
int width = layout.getWidth();
然而如果getWidth这个函数是在Activity的onResume方法执行完之前调用,得到的仅可能是“0”。一个简单的解决方案就是将getWidth方法搬到其他地方读取——等onResume方法执行完毕以后再调用。否则就只有是读取窗口的大小了——关于在加载初期获取界面大小的方法暂时没有找到。

另外,在获取了父控件的大小以后,下一步需要考虑的就是这个值会不会太小了。这个问题看似简单,解决起来却非常繁琐,就像许多网页开发者常常忘记考虑用户浏览器窗口可能处于任何大小的情况。一个最简单的办法,就是考虑一个“最小长宽”的设计,如果窗口过小,就隐藏部分生成的信息。这点请参考我的WhiteBoard类下的calcHeightOfTopBorder方法。

3、如何让界面大小更加灵活(下)?

接刚才所述,现在介绍calcHeightOfTopBorder方法中的一些技术。

在这个方法中,我的目的是读取图标的大小,并把他最为“最小长宽”的重要参考。正如一开始所讨论的,我们无法在界面加在好之前读取界面长宽,因此我们无法直接读取使用了图标的ImageView控件的大小。于是,我们直接去读取图标的大小。加载图标的办法可以参考官方对BitmapFactory类的介绍,这里我们要与大家分享的则是一个技巧:那就是在我们加载图标的时候,如果提供了一个BitmapFactory.Options,并将其中的属性“inJustDecodeBounds”设置为True,则实际上BitmapFactory类不会真正加载图片,而仅仅是读取长宽保存在BitmapFactory.Options的outWidth和outHeight变量中。这样,我们就节省了很大的内存空间:

BitmapFactory.decodeResource(this.context.getResources(), R.drawable.whiteboard_cancel, tempImage);
maxheight = maxheight > tempImage.outHeight ? maxheight : tempImage.outHeight;

转载自:http://www.mielf.net/featherelf/simple-android-library-project

你可能感兴趣的:(android)