B4X编程语言:B4A控件事件汇总

一、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
相关推荐
高山我梦口香糖7 分钟前
[react]searchParams转普通对象
开发语言·前端·javascript
冷眼看人间恩怨20 分钟前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
信号处理学渣29 分钟前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客29 分钟前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
jasmine s38 分钟前
Pandas
开发语言·python
biomooc1 小时前
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
开发语言·r语言
骇客野人1 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
black^sugar1 小时前
纯前端实现更新检测
开发语言·前端·javascript
404NooFound1 小时前
Python轻量级NoSQL数据库TinyDB
开发语言·python·nosql
用余生去守护2 小时前
python报错系列(16)--pyinstaller ????????
开发语言·python