Android学习笔记
来源:互联网 发布:河北网络公益广告大赛 编辑:程序博客网 时间:2024/04/30 23:41
Android提供了强大的事件处理机制,包括两套事件处理机制:
- 基于监听的事件处理。
- 基于回调的事件处理。
一、基于监听的事件处理
在事件监听的处理模型中,主要涉及如下三类对象:
- Event Source(事件源):事件发生的场所,通常就是各个组件。
- Event(事件):事件封装了界面组件换上发生的特定事情。
- Event Listener(事件监听器):负责监听事件源所发生的事件,并对各种时间做出相应的相应。
Android的事件处理机制是一种委派式事件处理方式:普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。
所谓事件监听器,其实就是实现了特定接口的Java类的实力。在程序中实现事件监听器,通常有如下几种形式:
- 内部类形式:将事件监听器类定义成当前类的内部类。
- 外部类形式:将事件监听类定义成一个外部类。
- Activity本身作为事件监听器类:让Activity本身实现监听器接口,并实现事件处理方法。
- 匿名内部类形式:使用匿名内部类创建时间监听器对象。
1、外部类形式
使用顶级类定义事件监听器类的形式比较少见,所以不推荐使用,主要因为如下两个原因:
- 事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。
- 外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程不够简洁。
使用步骤:
- 创建一个新类,实现需要监听事件的监听器接口。
- 在使用的时候,给某事件源的特定事件绑定此类。
示例:
事件处理类,监听了OnLongClick事件。
public class SendSmsListener implements OnLongClickListener { private Activity act; public SendSmsListener(Activity act) { this.act=act; } public boolean onLongClick(View arg0) { // 事件处理逻辑 return false; }}
调用:
public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn=(Button)this.findViewById(R.id.button1); btn.setOnLongClickListener(new SendSmsListener(this)); }}
2、Activity本身作为事件监听器类
这种形式使用Activity本身作为监听器类,可以直接在Activity类中定义事件处理方法,这种形式非常简洁。但是这种形式可能造成程序结构混乱,因为Activity的主要职责是完成界面初始化工作。
示例 :
public class Main extends Activity implements OnClickListener{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn=(Button)this.findViewById(R.id.button1); btn.setOnClickListener(this);//绑定Activity的OnClick事件 } public void onClick(View v) { // 事件处理逻辑 }}
3、直接绑定到XML标签中
在Android中,可以直接把事件处理绑定到XML标签中。
示例:
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:onClick="btnClick"/>
处理事件:
public class Main extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void btnClick(View v) { // 事件处理逻辑 }}
4、匿名内部类作为事件监听器
因为大部分时候,事件处理器都是没有复用价值的,因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适。这也是最广泛的用法。
示例:
public class Main extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn=(Button)this.findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 事件处理逻辑 } }); } }
二、基于回调的事件处理
对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己特定的方法将会负责处理该事件。此处理方法一般会有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件。如果返回true,表明该处理方法已完全处理该事件,该事件不会传播出去。如果返回false,表明该处理方法并未完全处理该事件,该事件会传播出去。
基于回调的事件处理方式主要用于重写新的组件,继承原组件的类,然后对其事件进行重写。在布局的时候,直接使用重写好的新组件。此时如果触发事件,则由新组件执行处理。(此方式一般不常用)
示例:
public class Mybutton extends Button { public Mybutton(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { super.onKeyDown(keyCode, event); //事件处理逻辑 return true;//表示该事件不会像外扩散 }}
总结:对于基于监听的事件处理模型来说,事件源和事件监听器是分离的,当事件源上发生特定事件之后,该事件交给事件监听器负责处理;对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,当事件源发生特定事件之后,该事件还是由事件源本身负责处理。
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- Android学习笔记--Gson笔记
- Android学习笔记
- Android学习笔记(二)
- android学习笔记--序
- android学习笔记1
- android学习笔记2
- android学习零碎笔记
- Android 学习笔记
- Android学习笔记(一)
- Android ExpandableListActivity 学习笔记
- Android EditText 学习笔记
- Android学习笔记3
- Android学习笔记4
- Android学习笔记5
- Android学习笔记9
- Android Animation学习笔记
- Android 学习笔记
- Android 数字签名学习笔记
- Android手机出现"已安装了存在签名冲突的同名数据包"的原因及解决办法
- 淘宝流量红利减少 淘品牌急寻突围路径
- 《ACM程序设计》例题解析-N皇后问题
- 在盈利狂潮中,苹果将粉身碎骨吗?
- poj_2387(最短路径Dijkstra)
- Android学习笔记
- 程序员
- 杭电2015
- 中国雅虎殒身记:当初说好的独立上市呢?
- UVa 10474 - Where is the Marble?
- vc mfc实现dialog半透明置顶效果
- mono中的中文问题
- 黑马程序员---线程
- 杭电2016