设为首页 加入收藏

TOP

Android学习笔记-事件处理(一)
2017-10-13 10:19:42 】 浏览:7948
Tags:Android 学习 笔记 事件 处理

第三章 Android的事件处理
Android提供两种事件处理方式,基于回调和基于监听器。前者常用于传统图形界面编程中,而后者在AWT/Swing开发中常用。
3.1 事件处理概述
对于基于回调的事件处理而言,主要是重写Android组件特定的回调方法,或者重写Activity的回调方法,一般用于处理通用性的事件。
对于监听的事件处理而言,主要是为Android界面组件绑定特定的事件监听器。
3.2 基于监听的事件处理
事件响应的动作通常以方法的形式组织,但Java是面向对象的编程语言,必须用类把这些方法组织起来,所以事件监听器的核心就是这些方法——事件处理器(Event Handler)。普通Java方法是由程序员调用,而事件处理器方法由系统调用。
事件监听器是特殊的Java对象,注册在事件源上,当用户触发事件时,就会调用事件处理器来响应。
委派式的事件处理:每个组件可以针对不同的事件注册不同的事件监听器,而每个事件监听器可以监听一个或者多个事件源。
1. 使用内部类

// 获取按钮,为按钮注册监听器,在onCreate方法中
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new MyClickListener());
// 定义监听器,内部类
class MyClickListener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        // 事件处理
    }
}

编程步骤:
获取界面组件(事件源);
实现监听器类(编程重点),实现XxxListener接口;
setXxxListener方法将事件监听器对象注册给事件源。
在触发事件后,事件会作为参数传递给事件监听器。但在上面的代码中,并没有出现事件的踪迹,原因是,当事件足够简单,事件中封装的信息比较有限,就无须封装事件对象了。但对于键盘事件,触摸屏事件等,就需要详细的信息。Android将其封装成XxxEvent对象。

// 用了匿名内部类
planeView.setOnKeyListener(new OnKeyListener() {
    @override
    public boolean onKey(View source, int keyCode, KeyEvent event){
        switch(event.getKeyCode()){
            // 获取由哪个键触发的事件,并处理
        }
        return true;
    }
});

常用的几个接口:

View.OnClickListener // 单击事件
View.OnCreateContextMenuListener // 创建上下文菜单
View.OnFocusChangeListener // 焦点改变
View.OnKeyListener // 按键
View.OnLongClickListener // 长按
View.OnTouchListener // 触摸屏

使用内部类的好处是:可以在当前类中复用该监听器类;内部类也可以自由访问外部类的界面组件。
2. 使用外部类
如果某个事件监听器需要被多个GUI界面共享,且主要是完成某种业务逻辑的实现,则可以定义为外部类。
但并不推荐将业务逻辑写在事件监听器中,包含业务逻辑的事件监听器将导致程序的显示逻辑与业务逻辑耦合。如果确实有多个监听器需要实现相同的业务逻辑方法,可以考虑使用业务逻辑组件来定义业务逻辑功能,再让事件监听器来调用其方法。

// SendSms类onCreate方法中
btn.setOnLongClickListener(new SendSmsListener(this, address, content));
// SendSmsListener类中
private Activity act;
private EditText address, content;
public SendSmsListener(Activity act, EditText address, EditText context) {
    this.act = act;
    this.address = address;
    this.content = content;
}
@Override
public boolean onLongClick(View source) {
    // 事件处理代码
    return true;
}

3. Activity本身作为事件监听器
缺点如下:
Activity主要是完成界面初始化工作,如果还需包含事件处理方法,会引起程序结构的混乱;
Activity界面类不该实现监听器接口。

// onCreate方法中
btn.setOnClickListener(this);
// 实现事件处理方法
@Override
public void onClick(View v) {
    // 事件处理
}

4. 使用匿名内部类
一般来说,事件处理器没有什么复用价值,可复用的代码都被抽象成了业务逻辑方法了,所以应该使用匿名内部类,这是最好的方法。
示例代码在上面内部类部分已经给出。直接new 监听器接口,或者new 事件适配器。
5. 直接绑定到标签
另一种简单的方法是直接在布局文件中指定事件处理方法。

// xml文件中
android:onClick="clickHandler"
// Activity类中
public void clckHandler(View source) {
    // 事件处理
}

3.3 基于回调的事件处理
回调机制中事件源和事件监听器是统一的,组件自己负责处理该事件,可以提高程序的内聚性。
继承组件类,并重写该类的事件处理方法。常用的有:

// 简单起见,省略了返回值和参数
onKeyDown() // 按键
onKeyLongPress() // 长按
onKeyShortcut() // 键盘快捷键
onKeyUp() // 松开按键
onTouchEvent() // 触摸屏
onTrackballEvent() // 轨迹球屏

代码示例:

// 自定义View
public class MyButton extends Button {
    // 构造方法略
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        // 事件处理
        return true;
    }
}
// xml文件中,各种属性略
<org.crazyit.event.MyButton />

事件传播
基于回调的事件处理方法都有一个布尔返回值,该返回值标识该方法能否处理该事件,如果不能则返回false,事件将继续传播。
先监听,后回调,最后到Activity
当组件上发生某个按键事件时,首先触发的是该按键绑定的事件监听器(Listener),接着触发该组件提供的事件回调方法(自定义组件中重写的),然后还会传播到该组件所在的Activity
Adnroid事件处理机制保证基于监听的事件监听器被优先触发,基于监听的事件模型中事件源与监听器分工明确,易于维护。
回调模型更适合于处理那些逻辑比较固定的场景,不需要监听,组件自行处理。
3.4 响应系统设置的事件
Configuration可以用于获取用户特

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android C代码回调java方法 下一篇仿《雷霆战机》飞行射击手游开发-..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目