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>

效果演示:

更多相关文章

  1. Android之SurfaceView简介(三)
  2. 【Android】Android(安卓)Studio使用gradle导出jar包并混淆代码
  3. Android事件处理
  4. Android-注册界面
  5. Android(安卓)onTouchEvent, onClick及onLongClick的调用机制
  6. Android高手进阶教程(二十三)之---Android中的日历读写操作!!!
  7. Android读写XML(中)——SAX
  8. android click 和onTouch 事件处理机制 (转)
  9. android textview 自动链接网址 修改默认点击事件

随机推荐

  1. PHP设计模式(创建型)
  2. php无乱码切割中文字符
  3. 树状数据结构存储方式(CUD 篇)
  4. 超详细分析php docker的原理及作用
  5. 基于 PHP-Casbin 的 ABAC 权限控制
  6. 在 PHP 中格式化并高亮 SQL 语句
  7. QueryPHP V1-beta.5 改进 ORM 设计体验
  8. 定位分析内存泄漏的原因和后果
  9. 树状数据结构存储方式(查询篇)
  10. php重定向后跳转不了