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>
效果演示: