Android中的事件处理总结

                                                                                       Android中的事件处理总结

Android系统对动作做出的响应机制就是事件处理。Android提供了两种事件处理机制。

  • 基于监听的事件处理机制
  • 基于回调的事件处理机制

一、基于监听的事件处理机制

Android的事件监听机制就是一种”面向对象”的事件处理,是一种”委派模式(Delegate)”事件处理方式。Android的UI组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理事件。例如:消防所(事件监听器)监听所有的火灾事件并处理火灾,所有的企事业单位(事件源)当发生火灾时本身自己无法灭火,都委托给消防所来灭火。

所以基于监听的事件的处理模型中,主要涉及三类对象:

  1. Event Source(事件源):事件发生的Android组件。例如:按钮、菜单等
  2. Event(事件): UI上面的事件源发生的特定的事件,一般都是通过Event对象获取。例如:长按、点击等
  3. Event Listener(事件监听器):负责监听事件源所发生的的事件,对各种事件做出相应的反应。例如:处理登录业务的响应。

 

 

事件监听模式分为以下几种使用场景:

  1. 内部类形式:将事件监听器类定义成当前类的内部类
  2. 外部类形式:将事件监听器类定义成一个外部类
  3. Activity本身作为事件监听器类:让Activity本身实现监听器接口,并实现事件处理方法
  4. 匿名内部类形式:使用匿名内部类创建监听器对象
  5. 直接绑定标签:直接在界面布局文件中指定标签绑定事件处理函数

 

方法一:内部类形式

将监听器类定义成当前类的内部类

 

方法二:外部类

将事件监听器类定义为一个外部类,通过外部类对事件源进行监听,并在外部类实现事件。

 

方法三: Activity本身作为事件监听器类

1.监听器设置为this,代表自身类、

2.自身类实现事件监听接口View.OnClickListener、

3.自身类重写接口onClick方法

 

 

方法四:匿名内部类

使用匿名内部类创建监听器对象

方法五:直接绑定标签

通过UI布局文件,设定UI控件的android:onClick的属性(事件处理方法),在相应的Activity代码文件中里面设置跟android:onClick设置的同名方法,且该方法必须是public void的,同时有一个View类型的参数

 

基于监听的事件处理机制总结:

 1).通过设置UI组件的android:onClick属性,然后代码实现方法:此方法业务逻辑和UI耦合性太高,实际业务一般不用

2).匿名类:一般只应用特定组件的特定业务响应

3).内部类:当前类可以重复使用该监听器类;当前类的所有界面组件都可以使用该内部类作为监听器。

4).外部类:可作为多个UI共同的事件处理,适用多个UI组件复用;但事件源要传递信息给事件监听器时则不太灵活,必须通过成员变量及构造方法

5).Activity自身类:处理比较灵活,实际中用的最多

6).当同一个UI对同一个事件注册多个监听器时,根据注册的顺序,最后注册的事件监听器优先触发,事件不再传递,最后触发的是通过UI设定的方法

 

 

二、基于回调的事件处理机制

监听机制是一种委托(Delegate)的事件处理方式;而回调机制则是事件源和事件监听是统一的(自己的事情自己干)。

方法回调是将功能定义与功能分开的一种手段,一种解耦合的设计思想;在Java中回调是通过接口来实现的, 作为一种系统架构,必须要有自己的运行环境,且需要为用户提供实现接口;实现依赖于客户,这样就可以 达到接口统一,实现不同,系统通过在不同的状态下"回调"我们的实现类,从而达到接口和实现的分离!

  Android提供的GUI组件上发生的所有事情,系统都提供了对应的事件处理方法,Java是一种静态语言无法给GUI组件或对象提供动态的添加方法,只能继承GUI,通过重写该类的处理方法来实现回调事件处理。 Android为GUI组件提供大量响应事件的方法,可以用于回调的使用。

常见View组件的回调方法:

androidGUI组件提供了一些事件处理的回调方法,View为例,有以下几个方法

在该组件上触发屏幕事件: boolean onTouchEvent(MotionEvent event);
在该组件上按下某个按钮时: boolean onKeyDown(int keyCode,KeyEvent event);
松开组件上的某个按钮时: boolean onKeyUp(int keyCode,KeyEvent event);
长按组件某个按钮时: boolean onKeyLongPress(int keyCode,KeyEvent event);
键盘快捷键事件发生: boolean onKeyShortcut(int keyCode,KeyEvent event);
在组件上触发轨迹球屏事件: boolean onTrackballEvent(MotionEvent event);
*
当组件的焦点发生改变,和前面的6个不同,这个方法只能够在View中重写哦! protected void onFocusChanged(boolean gainFocus, int direction, Rect previously FocusedRect)

 

在Android中基于回调的事件处理机制使用场景有两个:

1)自定义view

当用户在GUI组件上激发某个事件时,组件有自己特定的方法会负责处理该事件 通常用法:继承基本的GUI组件,重写该组件的事件处理方法,即自定义view 注意:在xml布局中使用自定义的view时,需要使用"全限定类名"

   

 

因为我们直接重写了Button的三个回调方法,当发生点击事件后就不需要我们在Java文件中进行事件监听器的绑定就可以完成回调,即组件会处理对应的事件,即事件由事件源(组件)自身处理!

 

2)基于回调的事件传播:

几乎所有的基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件:

1.如果返回true,则表明该处理方法已完全处理了该事件,该事件不会被传播出去。

2.如果返回false,表明该处理方法未完全处理该事件,该事件会传播出去。

对于基于回调的事件处理传播而言,某组件上所发生的事情不仅激发该组件上的回调方法,也会触发该组件所在的Activity的回调方法——只要事件能传播到该Activity。

即是否向外传播取决于方法的返回值是时true还是false;

传播的顺序是监听器--->view组件的回调方法--->Activity的回调方法

 

参照Android开发者文档可知OnLongClickListener() ,OnFocusChangeListener(),OnKeyListener()等监听器的使用场景。而onMenuItemClickListener则监听当菜单项被点击后触发的onMenuItemClick事件,

参考资料

[1].Flame_Dream.Android开发系列10——事件处理机制.OL.

https://blog.csdn.net/Future_One/article/details/104779618

 

[2].李yi辉.Android中的事件处理总结-基于监听的事件处理.OL.

 https://blog.csdn.net/yihuiworld/article/details/46308569

[3]. 输入事件概览  |  Android 开发者  |  Android Developers

https://developer.android.com/guide/topics/ui/ui-events?hl=zh-cn#EventHandlers

[4]. 3.2 基于回调的事件处理机制

https://www.runoob.com/w3cnote/android-tutorial-callback-event-handle.html

微信扫码订阅
UP更新不错过~
关注
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: listview是android一种展示列表的控件,通常会配合点击事件使用。当用户点击listview的某一项时,会触发点击事件,可以在事件处理函数进行相应的逻辑处理。比如跳转到对应的页面、刷新页面等等。 ### 回答2: Android的ListView是一种常用的控件,它可以在屏幕上展示一系列数据集合,用户可以通过滑动来查看其的内容。而点击事件则是ListView的一个重要特性,可以让用户在ListView选择并处理一些特定的数据。 ListView的点击事件一般分为两种情况: 1. Item点击事件:当用户点击ListView的某一项时触发。实现方法可以通过为ListView设置OnItemClickListener回调函数来实现,如下所示: listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 处理点击事件 } }); 其,parent代表ListView对象,view代表ListView对应的行View对象,position代表ListView行位置,id代表ListView对应的行id。 2. 按钮点击事件:当用户在Item点击某一个按钮时触发。实现方法可以在ListView的Adapter定义相应的处理函数,然后在对应的按钮添加监听器。 ListView的Adapter一般继承自BaseAdapter,需要实现三个函数:getView()、getCount()和getItem()。其getView()函数用于创建并返回一个View对象,也就是渲染每一个Item;getCount()函数返回ListViewItem的数量;getItem()函数返回位置position上的Item数据。 我们可以在Adapter的getView()函数设置每一个Item的按钮点击事件,例如: @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = LayoutInflater.from(context).inflate(R.layout.list_item, null); Button btn = view.findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 处理点击事件 } }); return view; } 以上就是一般的ListView点击事件的实现方法,开发人员可以根据自己的需要进行相应的设置和处理。 ### 回答3: Android的ListView是常用的UI组件之一,它可以让用户可以在一个滚动的列表查看数据项,口令用户可以与数据交互。 其,ListView的点击事件是在用户点击ListView的任何一项之后触发的事件。对于ListView的点击事件,我们可以用以下方法来实现: 1.在ListView布局文件添加android:onClick属性: ``` <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onListItemClick"/> ``` 其android:onClick属性指定了点击事件的方法名称。 2.在Activity或Fragment重写onListItemClick方法: ``` public void onListItemClick(AdapterView<?> parent, View view, int position, long id) { // 处理点击事件 } ``` 其,parent参数表示ListView本身,view参数表示当前被点击的项的视图,position参数表示当前被点击的项的位置,id参数表示当前被点击的项的ID。 3.使用setOnItemClickListener()方法来设置点击事件监听器: ``` listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 处理点击事件 } }); ``` 以上三种方法等效,可以根据自己的实际需求选择。 在处理点击事件时,可以根据position参数获取当前被点击的项的数据,进行相应的处理,例如打开一个新的Activity,发送一个网络请求等等。同时,也可以通过改变点击项的视图来提供视觉反馈,让用户更加明确自己点击了哪一项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逝不等琴生

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值