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

发布于:2024-12-18 ⋅ 阅读:(65) ⋅ 点赞:(0)

        一、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三个控件。不管是由选中状态变为未选中状态,还是由未选中状态变为选中状态,只要状态发生改变,就会触发该事件。
        假设有RadioButton1RadioButton2两个单选按钮,两个只能选中一个,可以用项下面代码:

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.HeightScrollView滚动面板的高度。
        只有当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