Android提供了强大的事件处理机制,包括两套事件处理机制:
1)基于监听的事件处理。
2)基于回调的事件处理(适合处理那种处理逻辑比较固定的View)。

Android 基于回调的事件处理,主要的做法是重写Android组件特定的回调方法,或者重写Activity的回调方法。而android为绝大多数的界面组件都提供了回调方法,所以我们只需要重写它们即可,是不是很简单。
但对于某些特定的事件,无法使用基于回调的事件处理,只能采用基于监听的事件处理啦。

这节博客,博主就先来串一下Android事件处理中的第一种方式:基于监听的事件处理吧。

基于监听事件处理

Event Source (事件源)
Event(事件)
Event Listener(事件监听器)

1)基于监听的事件处理模型示意图:
Android 事件处理详解(一) —— 基于监听的事件处理 1_第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 事件处理详解(一) —— 基于监听的事件处理 1_第2张图片

Android 事件处理详解(一) —— 基于监听的事件处理 1_第3张图片

更多相关文章

  1. android click 和onTouch 事件处理机制 (转)
  2. 关于手机启动的方向,和屏幕的单,双击事件
  3. android textview 自动链接网址 修改默认点击事件
  4. android 触发AppWidget上控件事件来更新AppWidget
  5. Android 事件触发机制
  6. Android 技巧 - listview 里面的图片不能响应onClick事件?

随机推荐

  1. LTP--linux稳定性测试 linux性能测试 ltp
  2. Linux Shell编程参考大全
  3. 高级Linux工程师常用软件清单
  4. linux系统更改目录和文件的权限总结
  5. linux基本操作(2)
  6. Linux-HA 入门指南(引用)
  7. Centos 7 利用LVM实现动态扩容
  8. linux下vim配置以及一些常用的快捷键
  9. ubuntu中ssh-server的安装与开机启动
  10. linux修改文件所属用户和组