一、B4A控件事件汇总列表
|--------|---------------|--------------------|-----------------------------------------------|
| 序号 | 事件名称 | 触发时机 | 适用控件 |
| 1 | Click | 用户单击控件时触发 | Activity、Button、ImageView、Label、Panel、TabHost |
| 2 | LongClick | 用户长按控件时触发 | Activity、Button、ImageView、Label、Panel、TabHost |
| 3 | Touch | 触摸屏幕时触发 | Activity、Panel |
| 4 | KeyPress | 用户按下按键时触发 | Activity |
| 5 | KeyUp | 用户释放按键时触发 | Activity |
| 6 | ItemClick | 用户单击列表项时触发 | ListView、Spinner |
| 7 | ItemLongClick | 用户长按列表项时触发 | ListView |
| 8 | CheckedChange | 控件选择状态改变时触发 | CheckBox、RadioButton、ToggleButton |
| 9 | EnterPressed | Enter键按下时触发 | EditText |
| 10 | FocusChanged | 控件获取或失去焦点时触发 | EditText |
| 11 | TextChanged | 控件文本发生变化时触发 | EditText |
| 12 | ScrollChanged | 控件滚动位置发生变化时触发 | HorizontalScrollView、ScrollView |
| 13 | ValueChanged | 控件的值发生改变时触发 | SeekBar |
| 14 | TabChanged | Tab(选项卡)切换时触发 | TabHost |
| 15 | OverrideUrl | WebView加载网页中的链接时触发 | WebView |
| 16 | PageFinished | Web页面加载完成后触发 | WebView |
二、B4A控件事件说明
1、Click事件和LongClick事件
要使用这两个事件,需要将控件的事件命名为 "控件名_Click" 或 "控件名_LongClick",然后在该事件的代码块中编写相应的代码。例如:
Sub Button1_Click
ToastMessageShow("点击了Button1按钮", True)
End Sub
Sub ImageView1_LongClick
ToastMessageShow("长按了ImageView", True)End Sub
End Sub
2、Touch事件
在B4A中,可以使用容器类控件(Activity、Panel)的Touch事件来处理触摸操作。当用户按下屏幕时,触发Down事件;当用户抬起手指时,触发Up事件;当用户按下并移动手指时,触发Move事件。简单示例代码如下:
Sub Panel1_Touch (Action As Int, X As Float, Y As Float)
Select Action
Case Activity.ACTION_DOWN
ToastMessageShow("按下屏幕", True)
Case Activity.ACTION_UP
ToastMessageShow("抬起手指", True)
Case Activity.ACTION_MOVE
Log("手指所在坐标:X="&X&",Y="&Y)
End Select
End Sub
在上述代码中,当用户在屏幕上按下或抬起手指时,会触发Panel1_Touch事件。在事件处理过程中,使用Select语句根据Action参数的值来判断手指的触摸方式,如果是按下或抬起,就使用ToastMessageShow函数显示相应的提示信息,如果是触屏移动,就向日志输出手指触摸点的位置坐标。
注意:
我们只有在Panel1控件范围内触摸才有反应,因为这是Panel1的触摸事件。
移动手指输出的触摸点坐标是Activity平面坐标,以Activity页面左上角为(0,0)点。
当Panel1内有其它控件,触摸到其它控件时没有反应,因为这些控件遮挡了Panel1,你触摸的是这些控件,而不是Panel1。
要获得以Panel1左上角为(0,0)点的Panel1平面坐标,需要使用Panel1.ACTION_DOWN、Panel1.ACTION_UP、Panel1.ACTION_MOVE来判断。有兴趣的朋友可以试一下。
使用Panel1平面坐标可以获得Panel1内某个控件(如Button1)的坐标范围是:X>=Button1.Left And X<=Button1.Left+Button1.Width And Y>=Button1.Top And Y<=Button1.Top+Button1.Height
要想为Panel1内的控件添加反应事件,我们可以依据其坐标区域判读按的是哪个控件,并为其添加执行代码。我们可以向Panel1添加一个透明的Panel2,与Panel1大小也一样,必须添加到顶层(最后添加,以遮盖其它控件),并使用以下代码:
Sub Panel2_Touch (Action As Int, X As Float, Y As Float)
Select Action
Case Panel2.ACTION_UP
If X>=Button1.Left And X<=Button1.Left+Button1.Width
_And Y>=Button1.Top And Y<=Button1.Top+Button1.Height Then
' 添加代码(相当于Button1_Cliick代码)
End If
If X>=Button2.Left And X<=Button2.Left+Button2.Width
_And Y>=Button2.Top And Y<=Button2.Top+Button2.Height Then
' 添加代码(相当于Button2_Cliick代码)
End If
...
End Select
End Sub
3、KeyPress和KeyUp事件
在B4A中,KeyPress和KeyUp事件用于检测按键是否被按下或释放。KeyPress事件在按键被按下时触发。KeyUp事件在按键被释放时触发。
Sub Activity_KeyPress (KeyCode As Int) As Boolean
If KeyCode = KeyCodes.KEYCODE_BACK Then
ToastMessageShow("按下了返回键", True)
Return True
End If
End Sub
Sub Activity_KeyUp (KeyCode As Int) As Boolean
If KeyCode = KeyCodes.KEYCODE_BACK Then
ToastMessageShow("释放了返回键", True)
Return True
End If
End Sub
注意:
KeyPress和KeyUp事件只能在Activity中使用。
KeyPress事件仅在焦点所在的视图不处理相应按键事件时才会被触发。如果焦点所在的视图处理了相应按键事件,KeyPress事件将不会被触发。
4、ItemClick和ItemLongClick事件
在B4A中,ListView控件是一种常用的用于展示数据列表的控件。ListView控件具有ItemClick和ItemLongClick事件,可以用于处理列表中每个项的点击和长按事件。
ItemClick事件在用户点击列表项时触发,可以通过以下代码为ListView的每个项设置ItemClick事件:
Sub ListView1_ItemClick (Index As Int)
'处理点击事件
End Sub
ItemLongClick事件在用户长按列表项时触发,可以通过以下代码为ListView的每个项设置ItemLongClick事件:
Sub ListView1_ItemLongClick (Index As Int)
'处理长按事件
End Sub
在上述代码中,ListView1是ListView控件的名称,Index是触发事件的列表项的索引。可以根据索引来获取相应的列表项数据,并执行相应的操作。
5、CheckedChange事件
CheckedChange事件在控件选择状态改变时触发,主要用于CheckBox、RadioButton、ToggleButton三个控件。不管是由选中状态变为未选中状态,还是由未选中状态变为选中状态,只要状态发生改变,就会触发该事件。
假设有RadioButton1、RadioButton2两个单选按钮,两个只能选中一个,可以用项下面代码:
Private Sub RadioButton1_CheckedChange(Checked As Boolean)
If Checked Then
RadioButton2.Checked=False
End If
End Sub
Private Sub RadioButton2_CheckedChange(Checked As Boolean)
If Checked Then
RadioButton1.Checked=False
End If
End Sub
6、EnterPressed事件
B4A中的 EnterPressed事件用于捕获用户按下回车键的操作。这个事件通常与输入框EditText控件一起使用,用于执行特定的操作或处理用户输入。
Sub EditText1_EnterPressed
' 在这里编写回车键被按下时的操作代码
End Sub
请注意,在 B4A 中,要使用 `EnterPressed` 事件,需要安装 B4XLibsGUI 库。
7、FocusChanged事件
FocusChanged事件在控件EditText获取或失去焦点时触发。常用于控件输入数据的合法性检验。
例如:当我们完成EditText1的输入,进入EditText2输入时,EditText1失去焦点,EditText2获得焦点,这两个控件均触发了FocusChanged事件。我们可以在EditText1失去焦点时检验其数据的合法性,如果不合法,将焦点移回EditText1以修改和重新输入数据。
Private Sub EditText1_FocusChanged (HasFocus As Boolean)
If HasFocus=False Then
Dim a As String=EditText1.Text.Trim
If a.Length=0 Then
xui.MsgboxAsync("您还没有输入数据!","提示")
EditText1.RequestFocus
Return
Else
If a.Length>10 Then
xui.MsgboxAsync("您输入的数据超出了10个字符,请修改!","提示")
EditText1.RequestFocus
Return
End If
End If
End If
End Sub
8、TextChanged事件
在B4A中,可以使用TextChanged事件来响应EditText控件文本发生变化的事件。通过添加TextChanged事件的处理程序,可以在用户输入文本时执行特定的操作。
EditText控件每新增或删除一个字符,都会引发TextChanged事件。我们可以依据此特性进行输入限定,可以限定输入的字符,也可以限定输入的字符串长度。
下面示例限定输入字符串最大长度是5个字符,超过5个字符Text将不会发生变化:
Private Sub EditText1_TextChanged (Old As String, New As String)
If New.Length>5 Then
EditText1.Text=Old
EditText1.SelectionStart = EditText1.Text.Length '将光标定在末尾
End If
End Sub
9、ScrollChanged事件
当ScrollView的滚动位置发生变化时,该事件处理程序都会被调用,当前滚动位置作为参数传递给该事件例程。
假设在页面有一个ScrollView1控件和一个lblLog文本标签(用于显示ScrollView1相关数据),我们用代码向其滚动面板添加两个文本标签:lblTop, lblBottom,分别添加到滚动面板的顶端和底端。通过ScrollChanged事件在滚动面板滚动时向lblLog输送实时信息。代码如下:
Sub Globals
Private ScrollView1 As ScrollView
Private ListView1 As ListView
Private lblTop, lblBottom As Label
Private lblLog As Label
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
ScrollView1.Panel.Height = ScrollView1.Height * 2
lblTop.Initialize("")
ScrollView1.Panel.AddView(lblTop, 0, 0, ScrollView1.Width, 40dip)
lblTop.Color = Colors.Blue
lblTop.TextColor = Colors.White
lblTop.Text = "Top"
lblBottom.Initialize("")
ScrollView1.Panel.AddView(lblBottom, 0, ScrollView1.Panel.Height - 40dip, ScrollView1.Width, 40dip)
lblBottom.Color = Colors.Red
lblBottom.TextColor = Colors.Blue
lblBottom.Text = "Bottom"
ScrollView1.ScrollPosition=ScrollView1.Height
End Sub
Private Sub ScrollView1_ScrollChanged(Position As Int)
lblLog.Text = $"ScrollView1.Height: ${ScrollView1.Height}
ScrollView1.Panel.Height: ${ScrollView1.Panel.Height}
Position: ${Position}
lblBottom bottom: ${(lblBottom.Top + lblBottom.Height)}"$
End Sub
运行以上代码,我们可以很好地理解ScrollView控件的运行机理和ScrollChanged事件的应用。
备注:
ScrollView视图的Height属性是ScrollView视图的显示窗口高度。
ScrollView的Panel.Height是ScrollView滚动面板的高度。
只有当Panel.Heigh大于Height时才有滚动发生。
ScrollView视图的ScrollPosition属性是显示窗口的最顶端处在滚动面板的位置。当没有滚动时,ScrollPosition的值是0,当向上滚动时,滚动面板向上滚动了多少,ScrollPosition的值就是多少,它体现了以显示窗口最顶端为基线的滚动面板的实时位置。
ScrollView控件其实就是在有限空间内显示大于其显示平面的内容的容器。
**10、**ValueChanged事件
B4A中的ValueChanged事件是指当控件的值发生改变时触发的事件。该事件主要应用于SeekBar控件,SeekBar控件是用于显示和调整进度的滑动条控件,它可以让用户调整音量、亮度、速度、大小等事项。
下面示例通过SeekBar的ValueChanged事件,逐步改变Panel1的背景色。
Private Sub SeekBar1_ValueChanged (Value As Int, UserChanged As Boolean)
Dim value1 As Int=Value*255/100
Panel1.Color=Colors.RGB(value1,value1,value1)
End Sub
参数Value是滑块位置值,最在最左侧为0、最右侧为100。
如果Value由用户滑动滑块改变,则UserChanged=True;如果Value由代码改变,则UserChanged=False。
**11、**TabChanged事件
TabChanged事件是用于处理Tab(选项卡)切换时触发的事件。
在B4A中,可以使用TabHost控件来实现选项卡功能。TabHost控件中有一个TabChanged事件,可以在该事件中编写代码来响应选项卡切换事件。
以下示例代码,演示如何使用TabHost和TabChanged事件:
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
Dim p1,p2 As Panel
p1.Initialize("p1")
p2.Initialize("p2")
TabHost1.AddTab2("第一页",p1)
TabHost1.AddTab2("第二页",p2)
End Sub
Sub TabHost1_TabChanged
Dim tabs As String
If TabHost1.CurrentTab=0 Then
tabs="第一页"
Else
tabs="第二页"
End If
ToastMessageShow("当前Tab页:"&tabs,True)
End Sub
12、OverrideUrl和PageFinished事件
OverrideUrl和PageFinished事件是B4A中WebView控件中的两个事件。
OverrideUrl事件在WebView加载网页中的链接时触发,在该事件中,可以通过检查URL来决定WebView是否需要打开链接。
PageFinished事件是在Web页面加载完成后触发的事件。在该事件中,可以添加只有在完成网页加载后才能执行的代码。
以下是简单的示例代码,演示如何使用这两个事件:
Private Sub WebView1_OverrideUrl (Url As String) As Boolean
' 在此处添加代码判断是否打开链接
If Url.Contains("163.com") Then
' 如果链接包含 "163.com",则WebView加载链接
Return False
Else
' 如果链接不包含 "163.com",则不加载链接
Return True
End If
End Sub
Private Sub WebView1_PageFinished (Url As String)
Log("网页加载完成!加载的网址是:"&Url)
End Sub