Android零基础入门第33节:Android事件处理概述

简介: 原文:Android零基础入门第33节:Android事件处理概述   通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件、选框的状态切换事件。     一、Android事件处理       Android提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理。
原文: Android零基础入门第33节:Android事件处理概述

   通过对Android基本组件的学习,也有接触少部分Android的事件处理,比如按钮的点击事件、选框的状态切换事件。

 

 

一、Android事件处理

 

    Android提供了两种方式的事件处理:基于回调的事件处理和基于监听的事件处理。

  • 基于监听的事件处理:主要做法就是为Android界面组件绑定特定的事件监听器,前面小节已经见到大量这种事件处理的示例。

  • 基于回调的事件处理:主要做法就是重写Android组件特定的回调方法, 或者重写Activity的回调方法。Android为绝大部分界面组件都提供了事件响应的回调方法,开发者只要重写它们即可。

 

    一般来说,基于回调的事件处理可用于处理一些具有通用性的事件,基于回调的事件处理代码会显得比较简洁。但对于某些特定的事件,无法使用基于回调的事件处理,只能采用基于监听的事件处理。

    本期先来学习基于监听的事件处理,后面再学习基于回调的事件处理,关注分享达人秀(ShareExpert)获取第一手教程,也可以加小编微信(jinwenyu2010)拽入Android零基础入门技术讨论微信群共同进步。

 

 

二、基于监听的事件处理概述

 

    基于监听的事件处理是一种更“面向对象”的事件处理,在事件监听的处理模型中主要涉及如下三类对象。

  • Event Source (事件源):事件发生的场所,通常就是各个组件,例如按钮、窗口、菜单等。

  • Event (事件):事件封装了界面组件上发生的特定事情(通常就是一次用户操作)。如果程序需要获得界面组件上所发生事件的相关信息,一般通过Event对象来取得。

  • Event Listener (事件监听器):负责监听事件源所发生的事件,并对各种事件做出相应的响应。

    当用户按下一个按钮或者单击某个菜单项时,这些动作就会激发一个相应的事件,该事件就会触发事件源上注册的事件监听器(特殊的Java对象),事件监听器调用对应的事件处理器 (事件监听器里的实例方法)来做出相应的响应。

    每个组件均可以针对特定的事件指定一个事件监听器,每个事件监听器也可监听一个或多个事件源。因为同一个事件源上可能发生多种事件,委派式事件处理方式可以把事件源上所有可能发生的事件分别授权给不同的事件监听器来处理;同时也可以让一类事件都使用同一个事件监听器来处理。

    Android事件处理流程如下图所示:

    从上图可以知道,基于监听的事件处理模型的流程如下:

  1. 为某个事件源(界面组件)设置一个监听器,用于监听用户操作。

  2. 当用户操作时,会触发事件源的监听器。

  3. 生成了对应的事件对象。

  4. 将这个事件源对象作为参数传给事件监听器。

  5. 事件监听器对事件对象进行判断,执行对应的事件处理器(对应事件的处理方法)。

 

    Android中基于监听的事件处理模型的开发步骤如下。

  1. 获取普通界面组件(事件源),也就是被监听的对象。

  2. 实现事件监听器类,该监听器类是一个特殊的Java类,必须实现一个XxxListener接口。

  3. 调用事件源的setXxxListener方法将事件监听器对象注册给普通组件(事件源)。

    对于这三件事情,事件源可以是任何界面组件,不太需要开发者参与;注册监听器也只要一行代码即可,因此事件编程的关键就是实现事件监听器类。

 

    在基于监听的事件处理模型中,事件监听器必须实现事件监听器接口,Android为不同的界面组件提供了不同的监听器接口,这些接口通常以内部类的形式存在。以View类为例,它包含了如下几个内部接口。

  • View.OnClickListener:单击事件的事件监听器必须实现的接口。

  • View.OnCreateContextMenu Listener :创建上下文菜单事件的事件监听器必须实现的接口。

  • View.onFocusChangeListener:焦点改变事件的事件监听器必须实现的接口。

  • View.OnKeyListener:按键事件的事件监听器必须实现的接口。

  • View.OnLongClickListener:长按事件的事件监听器必须实现的接口。

  • View.OnTouchListener:触摸事件的事件监听器必须实现的接口。

 

    通过前面的学习,知道事件监听器就是实现了特定接口的Java类的实例。在程序中实现事件监听器,通常有如下几种形式。

  1. 匿名内部类形式:使用匿名内部类创建事件监听器对象。

  2. 内部类形式:将事件监听器类定义成当前类的内部类。

  3. 外部类形式:将事件监听器类定义成一个外部类。

  4. Activity本身作为事件监听器类:让Activity本身实现监听器接口,并实现事件处理方法。

  5. 直接绑定到标签形式:直接在xml布局文件对应的Activity中定义一个事件处理方法,然后在布局文件中引用要触发的事件。

 

 

三、使用匿名内部类作为事件监听器

 

    大部分时候,事件处理器都没有什么复用价值(可复用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适。实际上,这种形式是目前使用最广泛的事件监听器形式,在前面的基本组件学习中也是使用的该种方法来绑定监听器。

    接下来通过一个简单的示例程序来学习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中基于监听的事件处理的其他四种形式下期再继续学习。

 

    今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

   此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!

 

 

往期总结分享:

Android零基础入门第1节:Android的前世今生

Android零基础入门第2节:Android 系统架构和应用组件那些事

Android零基础入门第3节:带你一起来聊一聊Android开发环境

Android零基础入门第4节:正确安装和配置JDK, 高富帅养成第一招

Android零基础入门第5节:善用ADT Bundle, 轻松邂逅女神

Android零基础入门第6节:配置优化SDK Manager, 正式约会女神

Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅

Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点

Android零基础入门第9节:Android应用实战,不懂代码也可以开发

Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio

Android零基础入门第11节:简单几步带你飞,运行Android Studio工程

Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌

Android零基础入门第13节:Android Studio配置优化,打造开发利器

Android零基础入门第14节:使用高速Genymotion,跨入火箭时代

Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航

Android零基础入门第16节:Android用户界面开发概述

Android零基础入门第17节:TextView属性和方法大全

Android零基础入门第18节:EditText的属性和使用方法

Android零基础入门第19节:Button使用详解

Android零基础入门第20节:CheckBox和RadioButton使用大全

Android零基础入门第21节:ToggleButton和Switch使用大全

Android零基础入门第22节:ImageView的属性和方法大全

Android零基础入门第23节:ImageButton和ZoomButton使用大全

Android零基础入门第24节:自定义View简单使用,打造属于你的控件

Android零基础入门第25节:简单且最常用的LinearLayout线性布局

Android零基础入门第26节:两种对齐方式,layout_gravity和gravity大不同

Android零基础入门第27节:正确使用padding和margin

Android零基础入门第28节:轻松掌握RelativeLayout相对布局

Android零基础入门第29节:善用TableLayout表格布局

Android零基础入门第30节:两分钟掌握FrameLayout帧布局

Android零基础入门第31节:少用的AbsoluteLayout绝对布局

Android零基础入门第32节:新推出的GridLayout网格布局

目录
相关文章
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
26天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
102 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
1月前
|
机器学习/深度学习 调度 Android开发
安卓应用开发:打造高效通知管理系统
【2月更文挑战第14天】 在移动操作系统中,通知管理是影响用户体验的关键因素之一。本文将探讨如何在安卓平台上构建一个高效的通知管理系统,包括服务、频道和通知的优化策略。我们将讨论最新的安卓开发工具和技术,以及如何通过这些工具提高通知的可见性和用户互动性,同时确保不会对用户造成干扰。
33 1
|
17天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
19天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。
|
19天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
21 1
Android开发之使用OpenGL实现翻书动画
|
19天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
15 1
Android开发之OpenGL的画笔工具GL10