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 日:初始版本