通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件、选框的状态切换事件。
一、Android事件处理
Android提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理。
一般来说,基于回调的事件处理可用于处理一些具有通用性的事件,基于回调的事件处理代码会显得比较简洁。但对于某些特定的事件,无法使用基于回调的事件处理,只能采用基于监听的事件处理。
本期先来学习基于监听的事件处理,后面再学习基于回调的事件处理,关注分享达人秀(ShareExpert)获取第一手教程,也可以加小编微信(jinwenyu2010)拽入Android零基础入门技术讨论微信群共同进步。
二、基于监听的事件处理概述
基于监听的事件处理是一种更“面向对象”的事件处理,在事件监听的处理模型中主要涉及如下三类对象。
当用户按下一个按钮或者单击某个菜单项时,这些动作就会激发一个相应的事件,该事件就会触发事件源上注册的事件监听器(特殊的Java对象),事件监听器调用对应的事件处理器 (事件监听器里的实例方法)来做出相应的响应。
每个组件均可以针对特定的事件指定一个事件监听器,每个事件监听器也可监听一个或多个事件源。因为同一个事件源上可能发生多种事件,委派式事件处理方式可以把事件源上所有可能发生的事件分别授权给不同的事件监听器来处理;同时也可以让一类事件都使用同一个事件监听器来处理。
Android事件处理流程如下图所示:
从上图可以知道,基于监听的事件处理模型的流程如下:
Android中基于监听的事件处理模型的开发步骤如下。
对于这三件事情,事件源可以是任何界面组件,不太需要开发者参与;注册监听器也只要一行代码即可,因此事件编程的关键就是实现事件监听器类。
在基于监听的事件处理模型中,事件监听器必须实现事件监听器接口,Android为不同的界面组件提供了不同的监听器接口,这些接口通常以内部类的形式存在。以View类为例,它包含了如下几个内部接口。
通过前面的学习,知道事件监听器就是实现了特定接口的Java类的实例。在程序中实现事件监听器,通常有如下几种形式。
三、使用匿名内部类作为事件监听器
大部分时候,事件处理器都没有什么复用价值(可复用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适。实际上,这种形式是目前使用最广泛的事件监听器形式,在前面的基本组件学习中也是使用的该种方法来绑定监听器。
接下来通过一个简单的示例程序来学习Android使用匿名内部类作为事件监听器。
同样使用WidgetSample工程,继续使用app/main/res/layout/目录下的activity_main.xml文件,在其中填充如下代码片段:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="使用匿名内部类监听事件"/>
</RelativeLayout>
为了监听按钮的点击事件,在Java代码中为其添加点击事件监听器,具体代码如下:
package com.jinyu.cqkxzsxy.android.widgetsample;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.event_anonymous_inner_class_layout);
// 获取界面组件
Button button = (Button) findViewById(R.id.button);
// 使用匿名内部类的实例作为事件监听器
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 实现事件处理
Toast.makeText(MainActivity.this, "收到点击事件", Toast.LENGTH_SHORT).show();
}
});
}
}
上面程序中的粗体字部分使用匿名内部类创建了一个事件监听器对象,“new监听器接口”或“new事件适配器”的形式就是用于创建匿名内部类形式的事件监听器。
运行程序,点击按钮,可以看到下图所示界面效果。
对于使用匿名内部类作为事件监听器类的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果Java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器类。
Android中基于监听的事件处理的其他四种形式下期再继续学习。