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>

效果演示:
这里写图片描述

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值