基于监听的事件处理机制模型

流程模型图:

  • 事件监听机制中由事件源事件事件监听器三类对象组成 ,处理流程如下:
  • Step 1:为某个事件源(组件)设置一个监听器,用于监听用户操作
  • Step 2:用户的操作触发了事件源的监听器
  • Step 3:生成了对应的事件对象
  • Step 4:将这个事件源对象作为参数传给事件监听器
  • step 5:事件监听器对事件对象进行判断,执行对应的事件处理器(对应事件的处理方法)
  • 事件监听机制是一种委派式的事件处理机制,事件源(组件)事件处理委托给事件监听器,当事件源发生指定事件时,就通知指定事件监听器执行相应的操作
  • 实现事件监听的方式主要有如下几种

使用匿名内部类

  • 直接 setXxxListener ,重写接口里面的方法即可,通常是临时使用一次,复用性不高!

  • 上图所示效果,布局文件 activity_main.xml 内容如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><Buttonandroid:id="@+id/btnOne"android:layout_width="match_parent"android:layout_height="64dp"android:text="按 钮"android:textColor="#001D25"android:textSize="20dp" />
</android.support.constraint.ConstraintLayout>
  • MainAcivity.java 实现代码如下:
package com.example.administrator.helloworld;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.util.Date;/*** 一个应用程序可以有1个或多个活动,而没有任何限制。* 每个为应用程序所定义的活动都需要在 AndroidManifest.xml 中声明,应用的主活动的意图过滤器标签中需要包含 MAIN 动作和 LAUNCHER 类别* 如果 MAIN 动作还是 LAUNCHER 类别没有在活动中声明,那么应用程序的图标将不会出现在主屏幕的应用列表中。*/
public class MainActivity extends AppCompatActivity {/*** 当活动第一次被创建时调用*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*** 从项目的 res/layout 中的XML文件加载 UI 组件* android.util.Log#d(java.lang.String, java.lang.String) 方法用于在 Logcat 窗口中打印日志*/setContentView(R.layout.activity_main);Log.d("Android Message:", "The onCreate() event");/** 为 按钮绑定单击事件* 就和 js 中为某个 id 的标签绑定事件差不多*/Button button = findViewById(R.id.btnOne);button.setOnClickListener(new View.OnClickListener() {/**重写点击事件的处理方法onClick()* 显示 Toast 信息,这个消息会显示到用户界面上,短暂显示后会消失* */@Overridepublic void onClick(View v) {Toast.makeText(getApplicationContext(), "你点击了按钮:" + new Date().toString(), Toast.LENGTH_SHORT).show();}});}
}

使用内部类

  • 其实原理和上面大同小异,使用内部类可以在该类中进行复用,可直接访问外部类的所有界面组件!
  • 布局文件仍会和上面的一致, MainActivity 类代码如下:
package com.example.administrator.helloworld;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.util.Date;/*** 一个应用程序可以有1个或多个活动,而没有任何限制。* 每个为应用程序所定义的活动都需要在 AndroidManifest.xml 中声明,应用的主活动的意图过滤器标签中需要包含 MAIN 动作和 LAUNCHER 类别* 如果 MAIN 动作还是 LAUNCHER 类别没有在活动中声明,那么应用程序的图标将不会出现在主屏幕的应用列表中。*/
public class MainActivity extends AppCompatActivity {Button button = null;/*** 当活动第一次被创建时调用*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*** 从项目的 res/layout 中的XML文件加载 UI 组件* android.util.Log#d(java.lang.String, java.lang.String) 方法用于在 Logcat 窗口中打印日志*/setContentView(R.layout.activity_main);Log.d("Android Message:", "The onCreate() event");/** 为 按钮绑定单击事件* 就和 js 中为某个 id 的标签绑定事件差不多*/button = findViewById(R.id.btnOne);button.setOnClickListener(new BtnClickListener());}/*** 定义一个内部类,实现 View.OnClickListener 接口,并重写 onClick() 方法*/class BtnClickListener implements View.OnClickListener {@Overridepublic void onClick(View v) {CharSequence buttonText = button.getText();Toast.makeText(getApplicationContext(), buttonText + " 被点击了", Toast.LENGTH_SHORT).show();}}
}

  • 同理也可以将它写成外部类,不再累述

implements View. OnClickListener

  • 方法都是大同小异,实现如下功能,点击 “播放”按钮后,开始播放手机上的 mp3 音乐;点击 “暂停” 按钮后,暂停音乐播放,点击“退出”按钮后,重置音乐,即回到初始位置,等待播放。
  • 播放 mp3 时,即使当前 Activity 被覆盖,在后台照样会播放。

  • 布局文件 activity_main.xml 内容如下:
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/GridLayout1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:columnCount="1"android:orientation="horizontal"android:rowCount="3"><Buttonandroid:id="@+id/btnStart"android:layout_width="match_parent"android:layout_height="64dp"android:text="播放" /><Buttonandroid:id="@+id/btnStop"android:layout_width="match_parent"android:layout_height="64dp"android:text="暂停" /><Buttonandroid:id="@+id/btnQuit"android:layout_width="match_parent"android:layout_height="64dp"android:text="退出" /></GridLayout>
  • MainActivity.java 内容如下:
package com.example.administrator.helloworld;import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;/*** 一个应用程序可以有1个或多个活动,而没有任何限制。* 每个为应用程序所定义的活动都需要在 AndroidManifest.xml 中声明,应用的主活动的意图过滤器标签中需要包含 MAIN 动作和 LAUNCHER 类别* 如果 MAIN 动作还是 LAUNCHER 类别没有在活动中声明,那么应用程序的图标将不会出现在主屏幕的应用列表中。* implements View.OnClickListener:用于绑定单击事件*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {/*** TAG:Log.d(String tag, String msg) 的消息标签* btn_play:播放按钮* btn_stop:暂停按钮* btn_quit:退出重置按钮* isRelease:判断 MediaPlayer 是否释放的标志*/private static final String TAG = "MainActivity : ";private Button btn_play;private Button btn_stop;private Button btn_quit;private MediaPlayer mPlayer = null;private boolean isRelease = true;/*** 当活动第一次被创建时调用*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*** 从项目的 res/layout 中的XML文件加载 UI 组件* android.util.Log#d(java.lang.String, java.lang.String) 方法用于在 Logcat 窗口中打印日志*/setContentView(R.layout.activity_main);Log.d(TAG, "The onCreate(Bundle savedInstanceState) .....");bindViews();}/*** 为按钮 绑定单击事件*/private void bindViews() {btn_play = findViewById(R.id.btnStart);btn_stop = findViewById(R.id.btnStop);btn_quit = findViewById(R.id.btnQuit);btn_play.setOnClickListener(this);btn_stop.setOnClickListener(this);btn_quit.setOnClickListener(this);}@Overridepublic void onClick(View v) {Log.d(TAG, "-----------" + v.getId());switch (v.getId()) {case R.id.btnStart:/**如果当前 MediaPlayer 未关联播放的文件,则进行关联* 播放的是 res/raw 目录下的 day_by_day.mp3 文件*/if (isRelease) {mPlayer = MediaPlayer.create(this, R.raw.day_by_day);isRelease = false;  //设置标识}mPlayer.start();    //开始播放btn_play.setEnabled(false); //禁用播放按钮btn_stop.setEnabled(true);  //启用暂停按钮btn_quit.setEnabled(true);  //启用退出按钮break;case R.id.btnStop:mPlayer.pause();    //停止播放btn_play.setEnabled(true);  //启用播放按钮btn_stop.setEnabled(false); //禁用暂停按钮btn_quit.setEnabled(false); //禁用退出按钮break;case R.id.btnQuit:mPlayer.reset();     //重置MediaPlayermPlayer.release();   //释放MediaPlayer,即释放与此媒体播放器对象关联的资源。isRelease = true;   //设置标识btn_play.setEnabled(true);  //启用播放按钮btn_stop.setEnabled(false); //禁用暂停按钮btn_quit.setEnabled(false); //禁用退出按钮break;}}
}

Android 基于监听的事件处理机制相关推荐

  1. Android基于监听的事件处理机制

    Android提供了强大的事件处理机制,主要包括两大类: 1,基于监听的事件处理机制:主要做法是为Android界面组件绑定特定的事件监听器 2,基于回调的事件处理机制:主要做法是重写Android组 ...

  2. Android事件的响应,Android 开发事件响应之基于监听的事件响应

    Android 开发事件响应之基于监听的事件响应 本文将介绍Android 操作系统如何通过监听来实现对事件的响应. Android 开发事件响应之基于监听的事件响应 背景介绍 Android 开发事 ...

  3. android datepicker 监听,DatePicker及其监听

    xml文件: android:id="@+id/datep" android:layout_width="wrap_content" android:layou ...

  4. Android怎样监听蓝牙耳机的按键事件

    Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...

  5. Android如何监听蓝牙耳机的按键事件(转)

    源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...

  6. Android监听左右滑删除通知,Android 滑动监听RecyclerView线性流+左右划删除+上下移动...

    废话不多说了,直接给大家贴代码了.具体代码如下所示: xmlns:tools="http://schemas.android.com/tools" android:layout_w ...

  7. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  8. Android RecyclerView 监听滑动

    今天,简单讲讲Android 如何监听滑动. 不废话了,主要是需要做一个功能,实现RecyclerView滑动时,让一个标题栏固定显示在顶部. 基本知识: 列表的滚动一般分为两种: 手指按下 -> ...

  9. android 如何监听应用前后台切换

    今天,简单讲讲android如何判断应用切换到后台和应用切换到前台. 这个其实很简单,之前需要做一个功能,当app由后台进入前台时需要完成一些逻辑操作,所以在网上查找如何判断app由后台进入前台,最终 ...

  10. java edittext 输入监听_Android应用开发之Android EditText 监听用户输入完成的实例

    本文将带你了解Android应用开发Android EditText 监听用户输入完成的实例,希望本文对大家学Android有所帮助. 我们都知道, Android   EditText输入框,并没有 ...

最新文章

  1. asp.net 域名欺骗式开发
  2. BCH优于BCE+LN的5个理由
  3. 要学习的别人的博客网址---收藏
  4. python中copy模块的使用,深拷贝和浅拷贝
  5. 1080 Graduate Admission (30 分)【难度: 一般 / 知识点: 模拟 排序】
  6. iOS之十三个小技巧帮你征服Xcode
  7. SAP CRM WebClient UI的搜索条件是怎么渲染出来的
  8. python输出数字方阵_在python里输出数字方阵
  9. iTerm2的颜色主题/配色主题/配色方案
  10. python 删除csv第一行_python 标准库学习之 csv
  11. USNews世界大学排名! CS引争议!中国高校霸榜:清华第一,北邮反超CMU
  12. [Java] Spring事务REQUIRES_NEW导致项目没有响应-原因DB maxActive没设置
  13. Python与Redis交互
  14. Python基础(19)_异常处理
  15. Web前后端数据交换技术和规范发展史:Form、Ajax、Comet、Websocket
  16. 反序列化时出现“base-64 字符数组的无效长度”错误提示的解决
  17. 2021外卖CPS分销微信小程序源码 外卖侠CPS全套源码
  18. 昂达平板不能开机刷机_手把手教你平板电脑刷机方法
  19. (Mysql)跨表查询和跨库查询
  20. 回首2021,展望2022 | 观成科技步履不停,刻画安全图腾

热门文章

  1. 关于co-NP的理解
  2. ios怎么引入masonry_iOS Masonry的使用需要注意的地方
  3. python模块_python模块介绍
  4. 拓端tecdat|Stata中的治疗效果:RA:回归调整、 IPW:逆概率加权、 IPWRA、 AIPW
  5. Hystrix服务降级、服务熔断介绍
  6. js基础知识汇总13
  7. Android tftp服务器,Ubuntu下配置TFTP服务以及 android下使用TFTP
  8. 问题1、图像分割预测时原始图片大小与预测图片大小不一致
  9. 建武28a对讲机最大距离_小米对讲机再出新品:不但价格低,还能一键写频
  10. pytorch RuntimeError: expected scalar type Double but found Float