`

一个简单的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 stadio NDK开发第一个例子

    本文将详细介绍如何在Windows环境下使用Android Studio进行NDK开发,创建并运行你的第一个NDK示例项目——FirstNdkDemo。 一、Android NDK介绍 NDK(Native Development Kit)是Google提供的一个工具集,它允许...

    android NDK 入门例子

    在Android Studio中,新建一个项目时可以选择“Empty Activity”,然后在build.gradle模块文件中添加对NDK的支持,例如: ```groovy externalNativeBuild { cmake { cppFlags "" abiFilters 'armeabi-v7a', 'arm...

    android电子书例子程序

    这个"android电子书例子程序"旨在为开发者提供一个起点,帮助他们理解和实现自己的电子书应用。本文将深入探讨这个示例程序可能包含的关键知识点,以及如何利用这些知识进行实际的开发工作。 首先,Android电子书...

    android lib的使用例子

    在Android Studio中,我们可以通过新建项目时选择“Library”模板来创建一个库项目。然后,在需要使用该库的主项目中,我们可以在Gradle依赖中声明对库项目的依赖,例如: ```gradle dependencies { ...

    Pro Android学习:了解package的小例子

    在Android中,每个应用都有一个唯一的用户ID(UserID),默认情况下,不同的应用具有不同的 UserID,以保护应用间的数据安全。然而,有时我们希望多个应用能够共享某些权限或数据,例如读写同一个外部存储目录。这时...

    android-beacon-library-reference:Android Beacon库的参考应用程序

    Android Beacon Library是一个强大的开源库,专门为Android设备设计,用于检测和交互与iBeacon和Eddystone等不同类型的蓝牙低功耗(BLE)信标。该库提供了一套全面的功能,使开发者能够轻松地集成Beacon技术到他们的...

    Android CMakeLists生成多个so文件

    这是一个文本文件,包含了一系列的指令,CMake会读取这些指令来生成构建系统,如Makefile。基本的CMakeLists指令包括: 1. `cmake_minimum_required(VERSION version)`: 定义所需的CMake版本。 2. `project(project...

    ButterKnifeDemo

    在某些情况下,当ButterKnife被用在一个库项目(Library Project)中时,编译过程可能会出现错误,因为ButterKnife的注解处理器无法正确地在库项目中运行。这个问题通常与Android Studio的构建配置和注解处理器的...

    Android上拉下拉自动刷新控件及其例子代码(Android Studio版本)

    This project aims to provide a reusable Pull to Refresh widget for Android. It was originally based on Johan Nilsson's library (mainly for graphics, strings and animations), but these have been ...

    Jni_Ndk开发最简单的例子

    本教程将通过一个简单的例子来介绍如何使用JNI和NDK进行开发。 首先,我们需要创建一个Android项目,包含一个简单的按钮和一个TextView。按钮的作用是触发JNI函数的调用,而TextView则用来显示JNI函数返回的结果。...

    androidNDK helloworld

    下面将详细讲解Android NDK的基础知识以及如何创建并运行一个简单的"Hello, World!"程序。 首先,NDK的主要用途包括: 1. **性能优化**:对于计算密集型或图形密集型应用,如游戏引擎、音频/视频处理,使用原生...

    AndroidStudio2.3 NDK Cmake配置

    例如,一个简单的CMakeLists.txt可能如下: ```cmake cmake_minimum_required(VERSION 3.4.1) add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED #...

    freetype android 编译so库

    Freetype是一个流行的开源字体渲染库,广泛用于多种操作系统和设备,包括Android。本篇将详细介绍如何在Android环境中编译Freetype库,生成适用于64位架构的SO(共享对象)库。 首先,理解Freetype库:Freetype是一...

    Mac下的AndroidStudio的NDK配置及开发示例

    例如,创建一个简单的函数: ```cpp #include #include extern "C" JNIEXPORT jstring JNICALL Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { std::string ...

    AndroidStudio-NDK开发 编译c代码提供so库和jar包 另外一个app调用,实例源码

    例如,创建一个名为`hello.c`的文件,其中包含C语言的简单函数。 3. **编写构建脚本**:创建`Android.mk`或`CMakeLists.txt`文件来指示Android构建系统如何编译C/C++代码。`Android.mk`是传统的Makefile格式,而`...

    如何使用Android Studio 开发Gradle插件

    在Android开发领域,Android Studio是首选的集成开发环境(IDE),而Gradle则是一个强大的构建工具,用于自动化项目构建过程。本篇文章将详细介绍如何使用Android Studio来开发Gradle插件,以便更好地理解和利用...

    Android Studio编译库文件(so/a)

    在这个例子中,我们有一个`native-lib.cpp`文件。 六、编译和运行 保存所有更改后,Android Studio会自动识别CMake配置并构建原生库。你可以通过点击“Make Project”按钮或使用快捷键(通常是Ctrl+F9)来编译项目...

    fmxlinux教程例子01源码.zip

    【标题】"fmxlinux教程例子01源码.zip" 提供的是一个使用Delphi开发的跨平台应用程序示例,特别针对Linux环境。这个压缩包包含了一系列关键的项目文件,让我们来逐一解析其中的文件及其在Delphi开发过程中的作用。 ...

    Android 模块化

    在"ModuleSample"这个压缩包中,我们可以期待找到一个关于Android模块化开发的示例代码,它可能包含了不同类型的模块以及它们如何相互协作的例子。这个示例可以帮助开发者更好地理解和实践Android的模块化开发。

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

Global site tag (gtag.js) - Google Analytics