安卓类库封装(向导)
本章将为大家讲解如何封装轻语言安卓程序中的组件类库,轻语言安卓程序底层开发语言为 Java ,因此学习本章内容前,读者需掌握一些基本的 Java 编程知识和原生安卓开发知识。
轻语言安卓类库一般分为两种格式:
-
可视组件
-
不可视组件
两种组件的工程结构基本一样,区别在与配置文件和具体代码的实现。
视频教程:安卓支持库类库组件封装教程
类库工程结构
-
static (存放静态资源文件夹)
- assets 存放不进行编译但会被打包到最终类库压缩包的文件
- libs 存放第三方 jar 包
- aar 存放第三方 aar 包
- res 存放drawable、layout、values自定义资源值
-
src 存放类库的源代码、允许多个包名
-
libtree.xml
- 该文件为类库的核心配置描述文件、在开发时非常重要;整个类库的函数声明、类库信息、包名等都需要在该文件中配置
-
*.vsln 类库项目索引文件
libtree.xml
该文件为类库核心配置描述文件,使用XML编写,在IDE中打开一个类库项目时,双击该文件将在 IDE 编辑器中被打开,默认内容如下图所示:
<?xml version="1.0" encoding="utf-8"?>
<package>
<library
name = "蓝色按钮"
author = ""
package = "myapp.component"
description = "类库功能描述;蓝色按钮组件"
type = "control">
<control name="蓝色按钮" comment="背景为蓝色、字体为白色的按钮组件">
<property name="标题" type="文本型" comment="设置或获取当前蓝色按钮的标题。" />
<method name="标题等于" return="逻辑型" args="(内容 为 文本型)" comment="标题等于。" />
<method name="置被拖拽回调" return="" args="(回调对象 为 被拖拽回调)" comment="设置被拖拽回调。" />
<interface name="被拖拽回调" comment="蓝色按钮的被拖拽回调接口。">
<event name="被拖拽" return="" args="(源对象 为 视图)" comment="当被拖拽时触发并回调该事件。" />
</interface>
</control>
</library>
<permission xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
</permission>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
</package>
-
package :配置文件根节点,不可修改
-
library :具体描述当前类库的节点、所有组件或类的声明都必须作为子节点添加到该节点中;同时该节点中也用于配置整个类库的具体信息、该节点包含以下属性:
-
name :描述指定类库的名称
-
author :描述类库作者或联系方式
-
package :设置类库当前的包名
-
description :类库的功能描述
-
version :版本(可省略)
-
type :指定类库的类型值;必须;(用于指定类库为可视类库还是不可视类)
-
control
可视组件 -
component
不可视控件
-
-
-
library :节点中支持添加的子节点标签类型
-
control 表示该节点为一个可视组件,支持的子节点类型:
- property 属性
- constant 常量
- method 函数
- interface 事件接口回调
- event 具体事件
-
component 表示该节点为一个不可视组件,支持的子节点类型:
- property 属性
- constant 常量
- method 函数
- interface 事件接口回调
- event 具体事件
-
class 表示该节点为一个纯数据类型,纯数据类型不能被添添加到窗口中,只能在代码中创建使用,纯数据类型不能含有属性、事件等子节点,只支持一个子节点类型:
- method 函数
-
-
permission :表示权限节点;在该节点中可添加用于当前类库可能用到的安卓静态权限。
-
manifest :用于配置当前类库在编译时,需要额外添加到(使用该类库的)App项目中的
AndroidManifest.xml
文件里application
节点中的内容;该节点中允许添加的子节点标签支持原生安卓清单文件中application
节点的任意内容;例如常见的:-
<activity>
-
定义一个原生的Activity窗口,示例:
-
<activity android:name=".MainActivity" />
-
-
<service>
-
定义一个 Service(后台服务),示例:
-
<service android:name=".MyService" />
-
-
<receiver>
- 定义一个 Broadcast Receiver(广播接收器),示例:
-
<receiver android:name=".MyBroadcastReceiver" />
-
<provider>
- 定义一个 Content Provider(内容提供者),用于与其他应用共享数据,示例:
-
<provider android:name=".MyContentProvider" android:authorities="com.example.provider" />
-
<meta-data>
-
元数据节点,为组件或整个应用提供自定义元数据,示例:
-
<meta-data android:name="com.google.android.geo.API_KEY" android:value="your_api_key_here" />
-
-
其它更多...
-
特殊节点
main-activity
主节点子元素、该节点下的内容会被添加到轻语言安卓框架中的主 Activity 中、例如:intent-filter、meta-data、activity-alias 等等;注意:该节点默认配置文档中并未添加、如有需要、需自行添加。<main-activity> <intent-filter> ... </<intent-filter> </main-activity>
-
注意:一个类库中可以添加无限个组件或数据类型、例如:当你要封装一个阅读APP的类库时、你可以将相关的组件或数据类型都封装到一个类库中;从而方便使用、分享。
-
可视组件
可视组件、顾名思义表示是可视的、可以看得见的组件;例如在APP中的按钮、标签、文本内容列表框等等;这些组件都属于可视组件;在 IDE 安装包中、位于 “sdk/android/components/primary” 该目录中都是官方已经封装好的组件、大家在封装时可以参考。
所有可视组件必须继承自视图
。
封装组件时首先需要先下载 VcnStudio 开发工具、并解压至非C盘目录;该步骤本教程跳过;打开IDE程序后、点击新建项目、在弹出的窗口中依次选择:移动应用->安卓支持库->可视组件 然后输入项目名称、点击确定;等待数秒、系统将会创建默认的类库项目。
点击确定后、如果无错误、将会打开创建成功的项目;如下图:
默认创建的项目包名为 myapp.component 、位于工程窗口中的 src 节点下面;在我们自定义创建类库时、可以自定义创建自己的包名;删除掉默认包名即可。然后将自己的组件源文件放到你自定义创建的包下面;例如:下方我们创建了一个自己的包名(选中src节点后右键菜单新建背包)、并在这个包中创建一个蓝色背景的标签组件:
默认创建打开后如上图所示为默认代码;此时我们需要修改为可视组件的模板(与默认蓝色按钮一致即可)、然后添加我们自己的代码;完成之后;代码为:
package exp.mytest;
/* 引入安卓开发框架的核心类 */
import com.simple.android.*;
/* 由于项目中没有用到这两个包的内容;需要屏蔽掉、否则编译器会报错 */
//import com.simple.components.*;
//import com.simple.control.*;
/* 引入安卓原生组件相关包 */
import android.view.View;
import android.widget.TextView;
import android.graphics.Color;
public class 蓝色标签 extends 视图
{
private TextView mTextView;
@Override
public View createView()
{
mTextView = new TextView(MainActivity.getContext());
mTextView.setBackgroundColor(Color.BLUE);
mTextView.setTextColor(Color.WHITE);
return mTextView;
}
public void 标题(String text)
{
this.mTextView.setText(text);
}
public String 标题()
{
return this.mTextView.getText().toString();
}
}
然后点击编译;如果代码编写无误、将会在IDE底部编译输出窗口输出编译信息;如果编译出现错误;将会输出错误信息、并同时结束编译;如果编译成功;将会提示包含“类库编译成功”的提示内容;并且在项目根目录文件夹中会新增一个“_build”文件夹;在该文件夹中会输出一个未压缩状态的类库目录、和一个后缀为“.scm”的单文件库(方便分享);复制该文件到 “IDE安装目录\sdk\android\components\extends
”中的分类文件夹、
注意:类库文件必须放在分类文件夹中,任意分类文件夹中即可。
至此、一个简单的可视类库就封装完毕了。
不可视组件
不可视组件、顾名思义在APP中是不可视的;例如时钟、网络操作库等等。不可视组件相对于可视组件、在封装时较简单;首先还是一样、新建项目时选择安卓不可视组件、创建项目后;会默认加载一个空的项目;该项目的默认工程模板与可视组件不完全一样;默认的类为一个普通的数据运算类;因为不可视组件不需要继承任何轻舟框架中规定的父类;其封装方式与原生 Java 编写 Jar 文件一模一样;因此相较可视组件而言、封装不可视组件更为简单、本文以自带的默认工程做示例讲解。
首先当我们打开项目并加载成功后的默认不可视组件代码为:
由于代码相对较简单、这里不做过多解释;但在实际封装时;应该将待封装的类放在自己创建的包中。
配置文档编写
在代码编辑窗口中;当代码编写完毕时、单击右键菜单;选择“生成类文档”菜单项、即可快速生成编辑窗口类的函数、方法文档;这里需要注意自动生成功能只会提取源码中声明为 public 公开的方法、及接口;非公共修饰符的类成员、包含方法接口都不会处理;除此之外只读与只写属性需要自行处理。
如果方法名称相同;且只有一个参数、参数类型和返回值都一样时、会自动识别为可读可写属性;例如:标题;如果方法为只读或只写属性、在方法前输入 /** 属性 */ 标记注释;生成时将会自动处理为属性。
代码示例:
/** 属性;只读属性 */
public String 只读方法名()
{
return "";
}
/** 属性;只写属性 */
public void 只写方法名(String value)
{
}
MainActivity 回调接口
当组件需要监听APP启动、窗口加载完毕、窗口被关闭事件时、可以通过在类库中实现轻舟安卓框架中预先定义的相关回调接口:
-
IOnRequestPermissions :OnRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
-
IOnActivityResult :OnActivityResult(int requestCode, int resultCode, Intent data)
-
IOnConfigurationChanged :OnConfigurationChanged(Configuration newConfig)
-
IOnNewIntent :OnNewIntent(Intent intent)
-
IOnCreate :OnCreate(Bundle savedInstanceState)
-
IOnDestroy :OnDestroy()
-
IOnKeyDown :OnKeyDown(int keyValue)
-
IOnStart :OnStart()
-
IOnResume :OnResume()
-
IOnPause :OnPause()
-
IOnStop :OnStop()
使用示例:
package mylc.ext;
import com.simple.android.*;
public class 我的组件 extends 视图 implements
IActivity.IOnCreate,
IActivity.IOnDestroy
{
Button mButton;
@Override
public View createView(){
this.mButton = new Button(MainActivity.getContext());
// 注册接口
IActivity.IOnCreates.add(this);
IActivity.IOnDestroys.add(this);
return mButton;
}
}
事件锚点,快速生成回调事件
在类库中如果含有回调事件、也就是给组件添加事件;可以在需要添加事件分发的代码处添加下方代码:
//dispatch:回调事件名称(String arg,int arg1)
例如:
@Override
public void onMarkerDrag(Marker arg0)
{
高德地图标记 flag = new 高德地图标记(arg0);
//dispatch:标记被拖动(高德地图标记 flag)
}
然后在代码编辑框中右键单击“插入锚点事件”即可自动生成相关联的回调接口代码和事件;需注意:如果存在多个相同名称的事件回调、只能保留一个回调事件。
其它问题
R资源处理
所有复制到 res 文件夹中的资源文件,默认引用时的包名为配置文档中 package 属性设置的包名,如果类库源代码中使用了第三方开源 Java 代码、第三方代码中用到了R 资源的引用,需修改成配置文档中设置的包名,修改后在编译时系统会自动处理,无需额外操作。
代码示例:
// 源代码中引用R资源时必须为配置文件中的包名
import myapp.component.R;
Jar包的使用
将待封装的 Jar 包文件放到类库项目文件夹中的 static/libs
文件夹内,在代码中即可像正常使用 Java 代码一样使用。
AAR包的使用
将待封装的 aar 包文件放到项目文件夹中的 static/aars
文件夹中即可;无需解压;封装时按照使用 jar 包一样、import 引用待封装的类正常使用即可;aar 包中的 R 资源文件会在编译时自动处理。
需特别注意:aar 包中如果引用了其它的 jar 或 aar 文件、也需要一并添加到相应文件夹中,但通常情况下;不建议一个类库中含有多个 aar 文件,因为在合并 AndroidManifest.xml
文件内容时可能会发生冲突或错误,当一个类库项目中含有多个 aar 包时,建议将其拆分。
AndroidX 的使用
将待封装的 androidx-*.jar
或 androidx-*.aar
包放到 static 文件夹下面对于文件夹中,在代码中正常引用指定类使用即可,但需特别注意:
-
AndroidX 会出现兼容问题,需自行处理。
-
AndroidX 包含很多小包、各个小包之间存在互相依赖,封装时需要找到所有用到的包。
-
非必要情况下不建议使用 AndroidX 包
可视组件的默认属性及事件
所有的可视组件都必须继承自视图类、而默认的视图类,是所有可视组件的抽象类,视图类中包含了所有可视组件都有的属性、函数、事件,例如每个可视组件都有相同的:
-
属性
-
可视
-
宽度
-
高度
-
...
-
-
函数
-
移动
-
到顶层
-
取原生对象
-
...
-
-
事件
-
被单击
-
被长按
-
焦点被改变
-
...
-
等等。
视图类是所有可视组件的抽象类,每个组件默认都有视图类中的属性、函数、事件,因此在封装组件时、您封装的组件里面不能包含已经存在的属性、函数或事件。
视图类中具体包含了哪些属性、函数、事件,可以在 IDE 中打开一个安卓项目,然后在支持库窗口中按下列路径查看:
核心支持库/基础类/视图
类库线上发布
封装好的类库可以发布到类库市场,销售;类库市场地址:VcnStudio - 类库市场