Android 事件处理详解(一) —— 基于监听的事件处理 1
Android提供了强大的事件处理机制,包括两套事件处理机制:
1)基于监听的事件处理。
2)基于回调的事件处理(适合处理那种处理逻辑比较固定的View)。
Android 基于回调的事件处理,主要的做法是重写Android组件特定的回调方法,或者重写Activity的回调方法。而android为绝大多数的界面组件都提供了回调方法,所以我们只需要重写它们即可,是不是很简单。
但对于某些特定的事件,无法使用基于回调的事件处理,只能采用基于监听的事件处理啦。
这节博客,博主就先来串一下Android事件处理中的第一种方式:基于监听的事件处理吧。
基于监听事件处理
Event Source (事件源)
Event(事件)
Event Listener(事件监听器)
1)基于监听的事件处理模型示意图:
2)所谓的事件监听器,其实就是实现了特定接口的java类的实例:
在程序中实现事件监听器通常有以下几种形式:
内部类形式:将事件监听器类定义为当前类的内部类、外部类形式:将事件监听器定义为一个外部类。Activity本身作为事件监听器类:让Activity本身实现监听器接口,并实现事件处理方法。匿名内部类形式:使用匿名内部类创建事件监听器对象。
下面我们分别来讲解一下吧。
1.内部类作为事件监听器类:
1>Android为不同组件提供了不同的监听接口:
由上面模型,我们认识到事件监听器必须实现事件监听接口,而android为不同的界面组件提供了不同的监听接口,这些接口通常都是以内部类的形式存在,这里以View为例,它包含了以下几个内部的接口:
View:
View.onClickListener:单击事件的事件监听器必须实现的接口。
View.onCreateContextMenuListener:创建上下文菜单事件的事件监听器必须实现的接口。
View.onFocusChangedListener:焦点改变事件的事件监听器必须实现的接口。
View.onKeyListener:按键事件的时间监听器必须实现的接口。
View.onLongClickListener:长单击事件的事件监听器必须实现的接口。
View.onTouchListener:触摸屏事件的事件监听器必须实现的接口。
2>内部类优点:
最常用的就是使用内部类的方式,因为它是部件的内部类,可以自由访问外部类的所有界面组件。
我们之前使用的也都是这种方式的监听器,这里我就不举例说明了哈。
2.外部类作为事件监听器类:
1>比较少见,缺点:
1)属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。
2)外部类的形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程就变得有点麻烦啦。
适用于:
某个事件监听器需要被多个GUI界面所共享,而且是完成某种业务逻辑的实现。
2>范例:
下面我们用一个实例来解释一下,这个例子的功能是:
在程序的外部定义了一个外部类作为onLongClickListener类,实现了发送短信的功能。
方法:
定义一个类,实现监听类onLongClickListener,传入需要的参数,并操作。
public class SendSmsListener implements OnLongClickListener{ private Activity act; private EditText address; private EditText content; //重写一个构造器,传入需要的上下文,发送短信的地址以及内容 public SendSmsListener (Activity act,EditText address,EditText content){ this.act=act; this.address=address; this.content=content; } @Override public boolean onLongClick(View v) {//在此方法中进行发送短信的操作 String addressStr = address.getText().toString(); String contentStr = content.getText().toString(); SmsManager smsManager = SmsManager.getDefault();//1.获取短信管理器 //2.创建发送短信的PendingIntent,需要传入上下文,请求码,intent以及标识flag PendingIntent sendIntent = PendingIntent.getBroadcast(act,0,new Intent(),0); //3.发送短信 smsManager.sendTextMessage(addressStr,null,contentStr,sendIntent,null); Toast.makeText(act,"发送完成",Toast.LENGTH_SHORT).show(); return false; }}
在界面中为组件添加事件。
public class MainActivity extends Activity { private EditText editTextaddress; private EditText editTextContent; private Button mButtonto; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextaddress= (EditText) findViewById(R.id.textaddress); editTextContent= (EditText) findViewById(R.id.textcontent); mButtonto= (Button) findViewById(R.id.buttonto); //添加监听事件 mButtonto.setOnLongClickListener(new SendSmsListener(this,editTextaddress,editTextContent)); }
发送短信的权限设置。
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
效果演示:
更多相关文章
- android click 和onTouch 事件处理机制 (转)
- 关于手机启动的方向,和屏幕的单,双击事件
- android textview 自动链接网址 修改默认点击事件
- android 触发AppWidget上控件事件来更新AppWidget
- Android 事件触发机制
- Android 技巧 - listview 里面的图片不能响应onClick事件?