首页 理论教育 Android事件监听器回调方法的使用

Android事件监听器回调方法的使用

时间:2023-10-22 理论教育 版权反馈
【摘要】:为了实现回调机制的事件处理,Android系统为所有GUI组件都提供了一些事件处理的回调方法。在上述代码中的onClick()回调没有返回值,但是一些其他Android事件监听器必须返回一个布尔值。在Android应用中,按键事件总是递交给当前焦点所在的视图。这样,当从这些事情监听器中返回true时会停止事件向其他Android事件监听器传播,并且也会阻塞视图中的此事件处理器的回调函数。

Android事件监听器回调方法的使用

在Android系统中,对于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己特定的方法将会负责处理该事件。为了实现回调机制的事件处理,Android系统为所有GUI组件都提供了一些事件处理的回调方法。在Android操作系统中,对于事件的处理是一个非常基础而且重要的操作,很多功能都需要对相关事件进行触发才能实现。例如Android事件监听器是视图View类的接口,包含一个单独的回调方法。这些方法将在视图中注册的监听器被用户界面操作触发时由Android框架调用。在现实应用中,如下的回调方法被包含在Android事件监听器接口中。

(1)onClick()

该方法包含于View.OnClickListener。当用户触摸这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后按下“确认”键或者按下跟踪球时被调用。

(2)onLongClick()

该方法包含于View.OnLongClickListener。当用户触摸并控制住这个item(在触摸模式下)或者通过浏览键或跟踪球聚焦在这个item上,然后保持按下“确认”键或者按下跟踪球(一秒钟)时被调用。

(3)onFocusChange()

该方法包含于View.OnFocusChangeListener。当用户使用浏览键或跟踪球浏览进入或离开这个item时被调用。

(4)onKey()

该方法包含于View.OnKeyListener。当用户聚焦在这个item上并按下或释放设备上的一个按键时被调用。

(5)onTouch()

该方法包含于View.OnTouchListener。当用户执行的动作被当做一个触摸事件时被调用,包括按下、释放,或者屏幕上任何的移动手势(在这个item的边界内)。

(6)onCreateContextMenu()

该方法包含于View.OnCreateContextMenuListener。当正在创建一个上下文菜单的时候被调用(作为持续的“长点击”动作的结果)。

在Android系统中,虽然上下文菜单的拥有者是View,但是生成上下文菜单却是通过Activity中的onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo)方法实现的,该方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法。会在用户每一次长按View时被调用,而且View必须已经注册了上下文菜单。

下面的代码演示了为一个按钮注册一个单击监听器的方法。

978-7-111-54543-9-Part02-420.jpg

978-7-111-54543-9-Part02-421.jpg

此时可能会发现,把OnClickListener作为活动的一部分来实现会简便很多,这样可以避免额外的类加载和对象分配。比如下面的演示代码。

978-7-111-54543-9-Part02-422.jpg

在上述代码中的onClick()回调没有返回值,但是一些其他Android事件监听器必须返回一个布尔值。原因和事件相关,具体原因如下。

■ onLongClick():返回一个布尔值来指示是否已经处理了这个事件而不应该再进一步处

理它。也就是说,返回true表示已经处理了这个事件而且到此为止;返回false表示

还没有处理它,或这个事件应该继续交给其他on-click监听器。

■ onKey():返回一个布尔值来指示是否已经处理了这个事件而不应该再进一步处理它(www.xing528.com)

也就是说,返回true表示已经处理了这个事件而且到此为止;返回false表示还没有

处理它,或这个事件应该继续交给其他on-key监听器。

■ onTouch():返回一个布尔值来指示监听器是否已经处理了这个事件。重要的是这个事

件可以有多个彼此跟随的动作。因此,如果当接收到向下动作事件时返回false,表明

还没有处理这个事件而且对后续动作也不感兴趣。那么,onTouch事件将不会被该事

件中的其他动作调用,比如手势或最后出现的向上动作事件。

在Android应用中,按键事件总是递交给当前焦点所在的视图。它们从视图层次的顶层开始被分发,然后依次向下,直到到达恰当的目标。如果我们的视图(或者一个子视图)当前拥有焦点,那么可以看到事件经由dispatchKeyEvent()方法分发。除了视图截获按键事件外还可以在活动中使用onKeyDown()和onKeyUp()来接收所有的事件。

注意:Android将首先调用事件处理器,其次是类定义中合适的默认处理器。这样,当从这些事情监听器中返回true时会停止事件向其他Android事件监听器传播,并且也会阻塞视图中的此事件处理器的回调函数。所以,当返回true时需要确认是否希望终止这个事件。

例如在下面的实例中,演示了基于回调的事件处理机制的实现过程。

978-7-111-54543-9-Part02-423.jpg

本实例中的基于回调的事件处理机制是通过自定义View来实现的,在自定义View时重写了该View的事件处理方法。本实例的具体实现流程如下。

(1)编写Java程序文件MyButton.java,功能是自定义了View视图,并且在定义时重写了该View的事件处理方法,具体实现代码如下。

978-7-111-54543-9-Part02-424.jpg

在上述代码中定义的MyButton类中,重写了类Button的onKeyDown(inl keyCode, KeyEvent event)方法,此方法的功能是处理按钮上的键盘事件。

(2)编写布局文件main.xml,使用在文件MyButton.java这个自定义的View,具体实现代码如下。

978-7-111-54543-9-Part02-425.jpg

978-7-111-54543-9-Part02-426.jpg

在模拟器中执行效果如图8-8所示。如果把焦点放在按钮上,然后模拟器上的任意按键将会在DDMS的LogCat的界面中看到如图8-9所示的输出信息。

978-7-111-54543-9-Part02-427.jpg

图8-8 执行效果

978-7-111-54543-9-Part02-428.jpg

图8-9 输出回调信息

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈