65.9K
CodeProject 正在变化。 阅读更多。
Home

Android 表单生成器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.68/5 (4投票s)

2017 年 6 月 27 日

CPOL

6分钟阅读

viewsIcon

16568

downloadIcon

490

Form generator 是一个用 Basic4Android (B4A) 编写的类模块,用于构建和处理表单数据。

引言

本文介绍了一个类模块 (fgen),用于在运行 Android 操作系统的移动设备上生成表单;开发语言是 B4A,一种 Basic 方言,必须编译才能获得 Java 可执行文件。

我希望本文也能对那些不太精通 Android 开发的人有所帮助,因为在 Android 开发中,程序是作为一组函数构建的,这些函数在发生特定事件时被激活。

这是对本文的更新,反映了该工具随着时间的推移,尤其是在实际应用程序开发中的使用,在功能和美观上所取得的演变。
新增的视图有:DateTimeCheck list、扩展的 toggle 按钮、**图形按钮**和 timer。从功能和美观的角度来看,按钮的形状和注释的呈现都得到了改进,还引入了对 FontAwesome 和 **Material Icons** 字体的支持,最后,通过伪类型 Window,可以在屏幕上任意调整表单的大小和位置。

背景

在 Android 中,用户交互对象称为视图,它们由程序放置在屏幕上;如果使用 B4A 进行开发,还可以使用内置的 UI Designer,它可以提供视图的声明和管理主要事件的方法。

由于表单通常不复杂,类模块 fgen 从视图列表中创建一个表单,并添加 **OK**、**Cancel** 和 **Reset** 按钮。当表单提交时(通过 **OK** 按钮),用户会在数据结构(map)中接收到数据;仅此一项可能不会特别有趣,但 fgen 还有一些其他选项使其更有用。

Using the Code

表单的生成基于一个视图列表,其中每个视图是一组有序的属性,TypeName 是必需的,而 Label、视图的 LengthDefault 值是可选的。在列表中,还可以插入一些其他命名信息(伪类型)。

本文不是该软件的用户指南,有关用户指南,您可以下载一个带有文档的演示程序 (sandbox),但本文只是对一些建立在标准视图上的功能进行了概述,以改进它们的行为。

B4A 项目必须包含 fgen 类脚本,要处理一个表单,用户必须

  • 创建一个视图列表
  • 创建一个类的实例:Dim fg As fgen
  • 初始化实例:fg.Initialize
  • 调用生成表单的两个函数之一
  • 管理数据

表单生成器 sub 的参数

fg.fg(Activity,parameters,Me,"handleAnswerSub","handleEventsSub")

  • activity,这就像一个 Windows Form,
  • 视图列表,
  • 包含处理数据的 subs 的模块,通常是 Me,
  • 将接收数据的 sub 的名称,
  • 用于处理事件的 sub 的可能名称(稍后通过示例解释)。
...
Sub Globals
...
Dim SectionsParm As String = "" _
	& "Ground,FF0000FF FF000000;" _
	& "U,TimeStamp,,," & DateTime.Date(DateTime.Now) & ";" _      ' a time stamp is a 
                                                                  ' field not 
                                                                  ' modifiable
	& "Section,Registry;" _
	& "T,Name,,15,El Condor,Patient Name;" _
	& "R,Sex,,12,Man,M:Man|W:Woman;" _
	& "N,Age,,5,75,age,Patient age;" _
	& "R,AgeType,,12,Years,Y:Years|M:Months;" _
	& "CMX,Symptoms,,200,,fever|rush|vomit;" _                     ' a text field which 
                                                                   ' can be compiled 
                                                                   ' also by choice
	& "Required,Name,Sex,Age,Symptoms;" _                          ' some fields are 
                                                                   ' mandatory
	& "After,AgeType,Age;" _                                       ' the radio buttons 
                                                                   ' post after 
                                                                   ' age field
	& "QS,Urgency,,9,Green,White|Green|Yellow|Red;" _              ' qualitative 
                                                                   ' Seek bar
	...
	Dim fg As fgen
...
End Sub

Sub Activity_Create(FirstTime As Boolean)
...
fg.Initialize	' instantiate Form Generator class
fg.fg(Activity,SectionsParm,Me,"handleAnswer","")
...
End Sub
...
Sub handleAnswer(fh_Data As Map)
	Dim btn As String = fh_Data.Get("fh_button")
	If btn <> "Cancel" Then
		...
	End If
End Sub
...

生成表单的第二种模式允许等待其关闭,并在同一个 sub 中继续:fg.fgw(Activity,parameters,Me,"handleEventsSub")

fg.fgw(Activity,parameters,Me,"")
Do While fg.fh_isrunning
    Sleep(100)
Loop
If fg.fh_Data.Get("fh_button") <> "Cancel" Then
...

文本和 Spinner 视图

除了普通的文本和密码,还提供了数字字段(有符号或无符号)和实数。文本字段集还包括隐藏字段和不可修改字段。除了标准的 spinner,还有另外两种变体,即带有文本的 spinner,可以在其中添加或删除 spinner 中的项,以及带有可写文本的 spinner,其中每个选择都会添加到文本中,例如,这对于填写症状列表很有用。

Seek Bars

B4A 的 seek bar 的范围可以从 0 到一个任意正值,在 fgen 的 seek bar 中,上下限可以是任意值,甚至是负值;当前值显示在 seek bar 的右侧。
定性 seek bar 是 seek bar 的一个变体,其响应是文本值。
S,Seekbar1,Seek 1,6,-3,10 -10; 范围从 10-10,默认值为 -3 的 Seek bar
S,Seekbar2,,6; 范围从 0100 且没有默认值的 Seek bar
QS,Urgency,,9,Green,White|Green|Yellow|Red; 默认值为 Green 的定性 Seek bar

呈现方式

表单按照编写的顺序以视图列的形式呈现,但是,通过伪类型 TitleGroundWindow 可以实现最小的视觉效果;最后一个设置表单的背景颜色或渐变,以及可能的透明度级别,并允许在屏幕上定位表单。伪字段 After 有助于在视图的右侧(也包括 Title)插入按钮或复选框或单选按钮。

另一种自定义形式是通过图像更改按钮的标题,或者仅通过适当的 Unicode 字符,如 ✎ (Chr(‭9998‬))、✘ (Chr(10008))、✓ (Chr(‭10003‬‬))、✉ (Chr(‭‭9993‬)),或者为 labelstitlecomment 使用 FontAwesomeMaterial Icons 字体。

可以在接收生成事件的 sub 中进一步自定义表单;在下面的片段中有一个示例。

...
Sub Globals
	Dim sample As String = "TITLE,Title,Test some handle;" _
						& "Ground,FF0000FF FF000000;" _
				        & "QS,Urgency,,9,Green,White|Green|Yellow|Red;" _
						& "T,Mail,,18,,insert mail,mai required;" _
						& "Check,Mail is mail;" _
						& "Required,Mail;" _
						& "CKB,Consent,,,, to keep data;" _
						& "N,Number,,10,,tell me,Insert Number;" _
						& "P,psw,Password,15,Insert password,Almost 6 characters;" _
						& "U,UnMod,Date,,__________________________;" _
						& "B,BtnGo,Go,,disabled;" _
						& "After,Consent,Mail"
	Dim pnl As Panel
	Dim fg As fgen	' instantiate Form Generator class
End Sub
Sub Activity_Create(FirstTime As Boolean)
	If Not(fg.IsInitialized()) Then fg.Initialize
	fg.fg(Activity,sample,Me,"handleAnswer","handleEvents")
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub handleAnswer(fh_Data As Map)
	Msgbox(fh_Data.Get("fh_button"),"Button pressed")
End Sub
Sub handleEvents(parm() As Object)	As Boolean	' view events handler
	' receive view, event, possible value
	Dim value As String = ""
	If parm.Length > 2 Then
		If parm.Length > 3 Then value = parm(3)
	End If
	Log("Handle event " & parm(0) & " event: " & parm(1) & " Value: " & value)
	If parm(1) = "Start" Then
		Dim lbl As Label = fg.getHandle("Title")
		lbl.TextColor = Colors.Red
		lbl.Color = Colors.Green
		lbl = fg.getHandle("UnMod")
		DateTime.DateFormat = "d MMMM y"	' e.g. 24 June 2017
		lbl.Text = DateTime.Date(DateTime.Now)
	Else
		Select parm(0)
			Case "Consent"
				fg.disable("BtnGo")
				If parm(3) = 1 Then fg.enable("BtnGo")
			Case "Urgency"
				Private urgencyColors() As Int = _
                Array As Int(Colors.White,Colors.Green,Colors.Yellow,Colors.Red)
				Private txt As EditText = parm(4)
				txt.TextColor = urgencyColors(parm(3))		' set color
		End Select
	End If
	Return True
End Sub

一些细节和解释:handleEvents sub 在触发一些通用事件时接收控件,sub 的参数是一个包含视图名称、事件和可能值的数组。在上面的片段中,在 start 事件(If parm(1) = "Start" Then)中,更改了 Title 的背景和颜色,并且 UnMod 字段接收了日期。

当复选框 Consent 触发事件时,button BtnGo 根据复选框的状态启用或禁用;最后,定性 seek bar Urgency 上的文本呈现相应的颜色。

多表单

移动设备屏幕尺寸使得表单处理变得困难,尽管 fgen 在需要时生成滚动条,但它允许通过伪类型 Section 将复杂表单分成多个部分,并在表单中添加适当的 <-- 后退和 --> 前进按钮。

所有部分的视图或伪类型(如 Ground 伪类型)必须出现在第一个部分之前。

另一种选择是伪类型 TAB,它允许通过 tabHost 来组织表单;它可以在分节中使用。在第一个标签之前只允许使用 groundtitle 伪类型。

由于 formgen 允许同时拥有多个表单,因此可以发送一个表单返回,然后在前景中将其重新调用。
这通过在表单的 title 中指定 hide 参数来实现

Title,History,Patient: " & name & ",,blue left,Hide;
HideTitle 的右侧插入 ,允许将表单置于后台;当表单在后台时,它会出现在屏幕右上角 ,允许将表单返回到前台。

数据检查和输入提示

fgen 通过伪类型 RequiredCheck 提供了一些数据控制;Check 通过比较运算符或正则表达式执行字段控制;可以提供警报。文本字段可以有两个额外的属性,第一个用作提示,第二个生成一个 toast 消息。例如,当字段获得焦点时会显示一段时间的消息。

...
& "Section,Password,AgeType=Y,Age>17;" _                        ' This session is 
                                                                ' shown if the 
                                                                ' condition is 
                                                                ' satisfied
& "P,psw,Password,15,,Insert password,almost 6 characters;" _   ' example of hint 
                                                                ' and toast message
& "P,repeatPsw,Repeat Password,15,,Retype password;" _
& "Required,psw;" _                                             ' password must be 
                                                                ' entered
& "Check,psw=repeatPsw,Password unmatched;" _                   ' password must match 
                                                                ' with the repetition
& "Check,psw is .{6" & Chr(1) & "},Password too short;" _       ' password must be 
                                                                ' almost 6 characters 
                                                                ' long regular 
                                                                ' expression .{6,}
& "Section,VitalParameters;" _
& "S,Height,,,,0 220;" _
& "S,Weight,,,,0 130;" _
& "S,Min,Minimum,,,20 200;" _
& "S,Max,Maximum,,,40 280;" _
& "S,HeartRate,Heart rate,,,0 250;" _
& "S,Temperature,,,36.5,30 48;" _
& "S,Saturation,,,,0 100;" _
& "Check,Max>Min,Max Pressure must be greater of min pressure;" ' coherence control 
                                                      ' from min ad max blood pressure
...

安装示例

.zip 文件中的 formgen.apk 必须复制到手机上。请参阅 Stack Overflow 上的文章: How to Install apk from PC?

历史

  • 2017 年 6 月 27 日:初始版本
© . All rights reserved.