Android 表单生成器






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

引言
| 本文介绍了一个类模块 ( 我希望本文也能对那些不太精通 Android 开发的人有所帮助,因为在 Android 开发中,程序是作为一组函数构建的,这些函数在发生特定事件时被激活。 这是对本文的更新,反映了该工具随着时间的推移,尤其是在实际应用程序开发中的使用,在功能和美观上所取得的演变。 |  | 
背景
在 Android 中,用户交互对象称为视图,它们由程序放置在屏幕上;如果使用 B4A 进行开发,还可以使用内置的 UI Designer,它可以提供视图的声明和管理主要事件的方法。
由于表单通常不复杂,类模块 fgen 从视图列表中创建一个表单,并添加 **OK**、**Cancel** 和 **Reset** 按钮。当表单提交时(通过 **OK** 按钮),用户会在数据结构(map)中接收到数据;仅此一项可能不会特别有趣,但 fgen 还有一些其他选项使其更有用。
Using the Code
表单的生成基于一个视图列表,其中每个视图是一组有序的属性,Type 和 Name 是必需的,而 Label、视图的 Length 和 Default 值是可选的。在列表中,还可以插入一些其他命名信息(伪类型)。
本文不是该软件的用户指南,有关用户指南,您可以下载一个带有文档的演示程序 (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; | 范围从 0到100且没有默认值的 Seek bar | |
| QS,Urgency,,9,Green,White|Green|Yellow|Red; | 默认值为 Green的定性 Seek bar | 
呈现方式
表单按照编写的顺序以视图列的形式呈现,但是,通过伪类型 Title、Ground 和 Window 可以实现最小的视觉效果;最后一个设置表单的背景颜色或渐变,以及可能的透明度级别,并允许在屏幕上定位表单。伪字段 After 有助于在视图的右侧(也包括 Title)插入按钮或复选框或单选按钮。
另一种自定义形式是通过图像更改按钮的标题,或者仅通过适当的 Unicode 字符,如 ✎ (Chr(9998))、✘ (Chr(10008))、✓ (Chr(10003))、✉ (Chr(9993)),或者为 labels、title 和 comment 使用 FontAwesome 或 Material 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将复杂表单分成多个部分,并在表单中添加适当的<--后退和-->前进按钮。所有部分的视图或伪类型(如  另一种选择是伪类型  | 
|  | 由于  Title,History,Patient: " & name & ",,blue left,Hide; | 
|  | Hide在Title的右侧插入 ,允许将表单置于后台;当表单在后台时,它会出现在屏幕右上角  ,允许将表单返回到前台。 | 
数据检查和输入提示
fgen 通过伪类型 Required 和 Check 提供了一些数据控制;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 日:初始版本


