文档库 最新最全的文档下载
当前位置:文档库 › ActXmlFromProject

ActXmlFromProject

ActXmlFromProject
ActXmlFromProject

1、项目名称

AXF (ActXmlFrom Framework) 活动ANDROID页面展现框架。

2、项目概述

运用XML解析技术实现动态的ANDROID页面加载功能,让ANDROID的企业级开发变得如编写网页一样简单。它主要由XML页面,启动主ACTIVITY处理逻辑类和主页面程序组成,极大的提高ANDROID的开发效率,动态加载页面灵活方便,让客户在后台控制前端程序页面成为可能。

3、应用范围

本框架可广泛应用于金融、保险、政府、企业等项目的定制开发中,让开发变得简单,让企业实现灵活配置页面,让ANDROID项目优美展现。

4、代码示例

为了给大家一个直观的印象,先给大家看一个页面代码和生成页面后的示例。

页面代码1

生成的页面效果:1

页面代码1中添加两个标签项目2:

修改后的代码生成页面的效果:2

点击“显示JSON数据”按钮,取得当前页面填写的数据:

5、项目基础框架介绍

5.1AXF框架的组成:

1、主页面支持类,也就是ANDROID应用的第一个ACTIVITY。

2、动态XML标签页面。

3、AXF主控制类。

4、属性文件类。

5.2主页面支持类:

每一个ANDROID应用都有一个主ACTIVITY,我们在这个类中主要做以下几件事, 1、决定进入到哪一个页面,也就是下面这个变量 formNumber ,我在示例当中

把所有的页面都做了编号,然后按顺序决定到哪个页面,真正的项目当中可以按照包名和文件名来区分跳转的顺序;

extras = new Bundle();

extras.putString("nextpage", "axf" +

formNumber.getText().toString());

取得相应的文件名称后将它装入到Bundle的”nextpage”属性中。

2、设置页面组件可编辑的模式,此变量为布尔值。布尔值为真时,进入到页面

后页面组件为不可编辑状态。

extras.putBoolean("isreturn", isreturn);

3、装入初始的数据信息,AXF以JSON字符串的格式装入初始信息。其中JSON的属

性名为页面当中定义的组件名称,两者对应后当页面加载过程中AXF将数据注入到对应的页面组件。

extras.putString("jsons", jsons);

其中特别声明的一点的当JSONS中存在returnfield属性时,它的属性值为页面组件名称,所有出现有这个属性当中的页面组件名称在上面“isreturn”

的值为真时,仍然可以编辑。

String jsons = "{returnfield:AXF001|AXF002|AXF003,cardName:中国

人}";

经过以上的初始设置后可以转入到AXF主控制类中动态加载页面了。

5.3动态XML标签页面

动态XML标签页面,顾名思义是一个XML文件,AXF支持标准的W3CXML文件格式。首先大家看一个示例文件:

layout_height="match_parent" background="@color/WHILT"

orientation="vertical" >

这是一个标准的XML文件格式,以“”开头和结尾,下面由

标签组成。目前做的AXF一个页面当中只支持一个标签。但AXF支持一个ANDROID页面当中加载多个动态XML标签页面。

首先来介绍一下动态XML标签页面的内部构成。

标签中提供了一组属性,其中id、name的属性是为了开发方便设计的,在AXF中暂时没有启用这两个属性。Passpage页面是本页面的上一个页面,如果为空则没有上一个页面。Nextpage为当前页面的下一个页面。如果当前的页面当中定义了上一页和下一页按钮,那么在按钮事件当中会跳转到相应的页面,这里的属性值为动态XML标签页面的文件名。

标签是一个页面的一行,相当于HTML当中的TR标签,在AXF中它会定义页面的标签样式和方位。默认为横向显示。

标签为AXF的基本页面组件,AXF1.0当中只支持txet、radio、label、view、button、choice、numeric这七种组件。后面我会给大家详细介绍这七种组件的用法。

5.4AXF主控制类

AXF只有一个主控制类,并且它是用户自定义的。用来加载页面和控制页面的流向并存取页面加载和处理数据。所有页面的所有逻辑都可以通过这个类来实现。直到退出AXF的控制范围。其实主页面支持类的功能也可以由此类来完成。

1、取得AXF主控对象,actxml = new ActXmlActivity(this);

2、按钮按名称绑定事件,示例中“submit”添加到主控类后,所有页面中所

有名称为“submit”的按钮都将被绑定这个事件

actxml.addButtListener("submit", listener);

3、加载页面,将上个页面的设置内容直接传递给AXF主控类

actxml.disPlayForm(bundle);

4、// 加载页面视图, setContentView(actxml.getSv())

5、加载其它用户自定义的页面组件到当前要跳转的页面中。

actxml.setMianView(butt);

5.5属性文件类

属性文件是AXF的页面标签数据文件,指定的属性文件存在项目目录下的assets/diclist.xml,以标准XML格式存储数据,路径为root/list/*来存储。

比如页面组件类型为radio,名称为“AXF006”,标签中需要展示男、女并赋值为0、1,默认选中男。那么在属性文件中定义如下:

今天就写到这里吧,时间也不早了,希望明天还有时间继续向大家介绍AXF。下周我会整理一个DEMO项目给大家直观的看一下AXF的具体样子。敬请期待。

6、动态XML标签页面

6.1表单的基础,FORM标签

所有的页面基础都是以一个FORM标签开始,相当于HTML的FORM标签,AXF 限制一个页面当中只能出现一对FORM标签。标签属性决定页面的流程,详细请看下面的说明。

示例代码:

标签属性 标签说明 应用示例

id 表单编号

name 表单名称,

passpage 上一页表单名称,XML标签

页面文件名,页面中点击上

一页按钮响应到此页面。上

一页为空是,不可以跳转。 AXF001,上一页动作时跳转到当前目录下的AXF001.xml页面

nextpage 下一页表单名称,XML标签

页面文件名,页面中点击下

一页按钮响应到此页面。此

属性可以有两个页面名称,

用“|”坚线分隔。

下一页为”

activityMain”时,跳转到

数据信息展示页面,本页面

不可编辑。 AXF001|AXF002,点击下一页动作时跳转到当前目录下的AXF001.xml和AXF002.xml页面组成的新页面。

6.2表单的最小单元,LAYOUT标签

页面的最小分隔单元,也相当于HTML语言中的TR标签,

代码示例:

orientation="vertical" >

标签属性 标签说明 应用示例

type 标签类型 Layout,标明本标签的类型

layout_width 当前一行的宽度 match_parent

layout_height 当前一行的高度 match_parent

background 当前一行的背景颜色,支

持ANDROID的标准颜色。

@color/WHILT,背景为白色

orientation 当前一行内控件的排列方

Vertical,平行排列控件

6.3页面控件,FIELD标签

页面控件标签是最终要显示在页面上的控件,分为输入、选择和按钮几类。同时AXF的控件是复合控件,一般包含说明和控件两部分,比如类型为TEXT的控件就会在页面上显示 “用户名”和输入框 两个部分,构成一个完整的页面输入单元。具体控件的类型和属性设置见下面的列表:

代码示例:

标签属性 标签说明 应用示例

name 控件名称。控件名称和JSON

属性关联,既可以在JSON

中为控件赋值,也可以取控

件的值到JSON中。另外初

始页面时还会将属性文件

中与本控件名称同名的节

点数据加载到当前控件中。

AXF050

label 控件提示名,显示在控件的

前面, 提示控件的功能。

可以为空,为空时不显示提

示栏

“用户名”

type 控件类型。目前AXF支持的

类型有:txet、radio、

label、view、button、

choice、numeric

详细说明见下表

required 是否可以为空,如果不能为

空输入“Y”,可以为“N”。

如果不能为空页面会在控

件提示信息栏前加“*”号,

同时在跳转页面之前做验

证,如果不能为空的控件为Y 不能为空。 N 可以为空。

空刚提示数据不完整,请重新输入,并且程序留在当前页面。

maxLength 可输入的内容最大长度,数

字类型 100,可输入100个字。未区分全角、半角

laWidth 提示栏宽度(PX),默认为

80PX。

80

txWidth 控件宽度(PX),默认为

80PX。

80

singleLine 换行操作。对于文本框默认

为可以换行输入,如果属性

值为TRUE,那么输入的文字

只能显示为一行。

TRUE

options 条件,暂未启用。

6.4控件类型说明

控件的类型决定的控件在页面上显示的样式和行为,目前只支持基本的页面控件,如果以后有发展需要再添加复合的控件和支持绑定自定义的事件到除按钮的其它页面控件中。

控件类型 控件说明 属性文件初始

支持事件绑定

txet 文本框 NO NO numeric 数字文本框,只支持输入整形数

字,不能输入小数,得到焦点后

会自动弹出数字键盘。

NO NO

radio 单选按钮, YES NO check 多选按钮,支持多选,多初始默

认值。选中的多个值在JSON中

以“|”线分隔,显示为“0|1”。

YES NO

choice 下拉选择框 YES NO label 文本提示框 NO NO view 分隔线,支持ANDROID的标准颜

NO NO

button 按钮,AXF自带的按钮有上一页、

下一页和显示数据三个按钮,其

它按钮由用户自定义。用户怎么

自定义按钮并绑定事件后面章

节中详细介绍。

NO YES

7、AXF控制逻辑类

7.1AXF入口控制逻辑类

我把入口逻辑类ActFirstActivity称和后面的主控类分开介绍是为了让大家清析初始和控制两个概念,其实这两个类是可以合并的。它们的功能是有重复的,但是在AXF中这两个概念是非常重要的。

ActFirstActivity类里面只有两个大的对象,AXF主控类和Bundle对象。我们主要讲Bundle的初始值设置。入口逻辑类中需要设置三个初始信息,下一页名称、是否允许编辑、JSON数据。

下一页名称,系统默认为/assets/目录下的MXL文件,AXF支持同一页面中展示多个AXFXML内容,多个页面用竖线隔开,例如“AXF001|AXF002“,加载的页面按下一页名称中的先后顺序显示。

是否允许编辑属性是一个非常重要的对象,如果设置为TRUE则页面控件置为灰色,并显示为不可编辑的状态。设置为FALSE时控件状态为正常编辑状态。

装入初始的数据信息,AXF以JSON字符串的格式装入初始信息。其中JSON 的属性名为页面当中定义的组件名称,两者对应后当页面加载过程中AXF将数据注入到对应的页面组件。

其中特别声明的一点的是当JSONS中存在returnfield属性时,它的属性值为页面组件名称,所有出现有这个属性当中的页面组件名称在上面“isreturn”的值为真时,仍然可以编辑。

"{returnfield:AXF001|AXF002|AXF003,cardName:中国人}";

以上示例中如果是否允许编辑属性的值为TRUE,那么所有页面中只有名称为“AXF001|AXF002|AXF003”这三个控件是可以编辑的,其它都置为灰色并不可编辑。

AXF使用表单的上一页、下一页属性控制页面的流转,目前尚不支持动态的流转方式,如果之后再深入的对这个项目做修改或有需要的时候会考虑做这个功能。第二个属性是应用到某些特别的场景,例如有些页面初始的值是只读的,不允许用户修改的,但其中一些又是可以修改的,那么就需要对每一个页面控件做以上的设置。初始数据的设置适应的场景一般是在数据修改和还原的时候,AXF 支持所有控件的数据还原,这一点是很多应用程序的难题,因为有很多的条件和限制,数据还原过程中会出现不完整, 非常复杂的情况,在AXF中实现就变得非常的容易自然。

7.2AXF主控逻辑类

AXF主控类分控制流转、参数注入、定义控件、定义事件几部分组成。

如果你的应用极其单纯,就是由表单和按钮组成,那么在主控类中就可以写的极其精简。只有以下几行代码:

7.2.1显示AXF页面

1、actxml = new ActXmlActivity(this); // 取得AXF对象

AXF所有的操作都是由主控类(当前的ACTIVITY)对ActXmlActivity类的操作达成的,也就是说我们能够看到的AXF类只有一个,就是ActXmlActivity类,它虽然叫做ACTIVITY,但它只是一个普通的POJO类,跟ACTIVITY一毛钱关系都没有。但它在AXF中完成的是一个加载页面和显示页面,操作数据的任务和ANDROID中的ACTIVITY的功能是一样的,所以在这里也只好这样叫着了。

2、Bundle bundle = getIntent().getExtras();

3、actxml.disPlayForm(bundle); // 加载页面

Bundle对象是AXF中承载所有数据的中间通道,这里如果需要对页面间的数据进行修改和过滤可以在这里进行拦截处理。比如说我想在下一页为第五个页面时显示“您的基础资料已填写完整,现在进行业务确认阶段。”那么,就可以在这里将Bundle的NEXTPAGE属性取出来做个判断,如果是第五个页面,就弹出框显示以下的信息。或者上一页中客户录了什么样的数据在下一页中做其它的处理也可以在这里对JSONS属性做些修改。

4、setContentView(actxml.getSv()); // 加载页面

AXF加载页面是对XML中形成的页面代码加载到当前的ACTIVITY中,所有的页面都是能过主控类加载到真正的ANDROID页面中的。因为实际上AXF项目中没有一个类是继承了ANDROID的ACTIVITY类,这样只能依靠主控类来实现。

7.2.2自定义页面控件

这样一个简单的AXF页面就可以正常的显示出来了。如果你想要在页面上加入自定义的控件,可以任意的定义并添加进表单当中。实现如下:

// 自定义按钮

Button butt = new Button(ActControlActivity.this);

butt.setText("显示JSON数据");

actxml.setMianView(butt);

AXF中提供了三个方法供你选择将自定义的控件添加到页面中,分别为: actxml.setBeforView(butt);

actxml.setMianView(butt);

actxml.setAfterView(butt);

字面可以理解为添加到头部,中间和底部三个页面位置。这个位置是相对于我们的动态XML页面来讲的。其中添加到中间位置也是添加到页面的底部,因为这很难去做决定添加到哪个具体的位置,如果有哪位朋友真的需要添加控件到页面的中间或其它想要的位置,我们再讨论如果去实现吧。

7.2.3绑定事件

AXF中添加自定义的事件分为两种,绑定到自定义的控件上和绑定到XML中定义的控件上。

绑定到自定义的控件时和平时我们做的一样,因为控件就是在这里定义的,那么只需要调用ANDROID的API就可以实现了,如给之前定义的按钮绑定一个事件:

butt.setOnClickListener(listener);

AXF中定义了一个绑定事件的方法将用户自定义的事件绑定到XML中定义的控件中,方法名称为:addButtListener(String buttName, OnClickListener listener),那么如果XML中有如下定义:

定义了一个显示名称为“拍照”的按钮,那么可以在主控逻辑类中为它绑定一个事件,实现如下:

// 实现按钮事件

OnClickListener listener = new MyOnClickListener();

actxml.addButtListener("photograph ", listener);

这里添加事件当中第一个参数为XML中定义的页面控件的name属性。页面加载过程中用这个名称来绑定外部事件。

7.2.4存取页面数据

AXF中提供了设置页面数据,获取页面数据的方法。获取页面数据之前需要调用验证数据的方法,验证数据方法定义为public boolean checkForm(),方法内容实现了两个功能,1是验证数据的准确性,目前只支持带星号的必填功能,2是验证通过将数据保存到JSON中。调用方法如下:

if (actxml.checkForm()) {

json = actxml.getFormToJson();

} else {

json = "带星号的为必填项,请重新输入。";

}

获取到的数据以JSON的格式保存到一个字符串中,AXF还提供了方便的JSON 转换方法,如将JSON转换成POJO,将字符串转换成JSON。调用示例如下: card = (CardEnt) actxml.jsonToEntity(json, CardEnt.class);

将一个JSON字符串转换为CardEnt类的对象。

8、AXF实现客户信息录入项目

8.1项目基本需求

客户信息的录入项目有以下几个需求:

1、用户需要登陆

2、正确登陆后对页面进行录入

3、最终获取录入的信息,

4、如果登陆出错跳转到出错页面,

5、如果页面录入不完整就点击下一页,提示用户继续录入不能进入下一页。

6、每个页面中需要保存客户资料,

7、录入完成后退出登陆。

8.2创建工程

针对以上的需求我们做登陆页面,个人信息页面1、2、3页,预览页面页5个ANDROID页面来实现。那么万事开头都是从一个空工程开始的,下页我们创建一个ANDROID工程:

8.3添加AXF包和属性文件

新建工程叫做AXFFIRST,我们要用AXF需要添加AXF的核心包,目前版本是AXFAndroid1.0.10.jar。另外需要添加的JAR有两个gson-2.0.jar 、dom4j-1.6.1.jar ,AXF项目还需要一个属性文件diclist.xml,那么我们把这两个必要的条件添加进来,再看一下目录结构:

添加完成以上两个必要的文件之后,本项目就正式成为了一个AXF项目了,那么我们就可以在项目当中应用之前我们讲到过的动态页面和控制逻辑类来实

现动态页面了。

8.4实现登陆页面

1、 我们需要在/assets/目录下新建一个login.xml的页面,登陆页面一般有用

户名、密码和登陆按钮。下面看XML页面中的实现:

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

页面当中有三个控件,分别定义了类型,显示宽度,是否为空等信息。 2、 在AxfFirstActivity的ACTIVITY中实现第一个页面的初始信息设置和跳转

到AXF主控页面中,具体实现如下:

Intent newFormInfo = new Intent(AxfFirstActivity.this, AXFControlActivity.class);

Bundle extras = new Bundle();

// 指定下一页加载的页面名称

extras.putString("nextpage", "login");

// 初始页面数据

extras.putString("jsons", null);

// 指定是否是退件

extras.putBoolean("isreturn", false);

// 添加BUNDLE数据到主控逻辑类

newFormInfo.putExtras(extras);

// 跳转到主控逻辑类

startActivity(newFormInfo);

3、添加主控逻辑类AXFControlActivity,实现页面的设置和显示操作,具体实

现如下:

// 取得AXF对象

ActXmlActivity actxml = new ActXmlActivity(this);

Bundle bundle = getIntent().getExtras();

// 加载页面

actxml.disPlayForm(bundle);

// 加载页面

setContentView(actxml.getSv());

完成了以上代码的编写,那么我们的AXF工程的登陆页面基本上可以显示出来了,让我们看一下页面效果。

页面效果就是这样的,非常激动人心,我们只用了短短几行代码就实现了一个ANDROID的页面,并且做这个页面的技术难度要比ANDROID本身提供的页面容易得多,只要有编程经验的人很容易都能掌握AXF页面的编写方法。

8.5个人信息录入页面1

添加个人信息页面的代码比较简单,只需要把录入项目按照事先做好的模型添加进去就可以了,我们行看一下第一个个人信息页面inform1.xml的代码:

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

maxLength="10"laWidth=""txWidth="150"singleLine="true"options=""/>

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

由于它是第一个页面,所以FORM标签中不需要PASSPAGE属性,它的NEXTPAGE 属性值为inform2.xml,也就是说当点击下一页按钮时,页面会跳转到第二个页面。大家一起看一下第一个页面的效果图:

接下来是第二个页面的代码:

nextpage="inform3">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

maxLength="20"laWidth=""txWidth="150"singleLine="true"options=""/>

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

layout_height="match_parent"background="@color/WHILT"

orientation="vertical">

第二个页面和第一个页面不同的地方在于,FORM标签的PASSPAGE属性值为inform1.xml,NEXTPAGE属性值为inform3.xml,表明在当前页面点击上一面会回到第一个页面,下一页时会跳转到新的第三个页面中,跳转的动作已经在AXF 内部实现,我们不需要写任何代码就可以实现效果,一起看一下第三个页面的效

果:

8.6实现按钮事件

示例中我们将在第二个页面中添加一个“TYPEJSON”的按钮,按钮事件中实现获取所有页面填写的数据信息的功能,那么首先我们需要在第二个XML页面中添加以下控件信息:

之后在主控类当中实现一个按钮的监听事件类:

// 定义按钮事件

class MyOnClickListener implements OnClickListener {

@Override

public void onClick(View v) {

String json = null;

if (actxml.checkForm()) {

json = actxml.getFormToJson();

} else {

json = "带星号的为必填项,请重新输入。";

}

Toast toast = Toast.makeText(AXFControlActivity.this,

json, Toast.LENGTH_LONG);

toast.show();

}

}// 结束

主控类的onCreate方法中添加以下代码:

// 实现按钮事件

OnClickListener listener = new MyOnClickListener();

actxml.addButtListener("typejson", listener);

大家注意在代码当中添加到AXF控制类中的参数为“typejson”、listener,这两个参数告诉AXF在所有页面中叫做typejson的控件都会绑定listener事件。好的,我们最后看一下实现的效果:

下面给大家看一下完整的属性文件:

0000000000889999

居民身份证

护照

通行证/台胞证

高中、中专或以下

大专

本科

硕士

博士

9、结束语

讲到这里呢,基本上就讲完了,有兴趣的朋友可以到后面下载工程的源代码,希望大家一起学习做优雅的ANDROID页面程序。

相关文档