第四章 Android事件处理机制 QQ群:287966120 Q Q号: 2227351322 倚动软件工厂实验室.

Slides:



Advertisements
Similar presentations
网络应用程序设计 2014 JavaBean. JavaBean 及其属性 JavaBean 就是一种 Java 的组件技术 JavaBean 是 Java 类 JavaBean 通过约定的方法名实现属性功能 简单属性 void setXxx(Type value) Type getXxx() boolean.
Advertisements

3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
项目2 字符格式和段落编排 2017年3月7日6时54分.
第13章 繪圖與多媒體 13-1 顯示圖檔-行動相簿 13-2 音樂播放-音樂播放器 13-3 影片播放-視訊播放器
實驗五:多媒體播放器選單介面.
Part 2 開發Android應用程式的流程
第二章 JAVA语言基础.
第14章 c++中的代码重用.
在PHP和MYSQL中实现完美的中文显示
第10讲 Java面向对象编程基础(4) 教学目标 主要内容.
第三章 Android高级界面控件(4) QQ群: Q Q号: 倚动软件工厂实验室.
Android + Web Service 建國科技大學 資管系 饒瑞佶 2017/3 V1.
ArrayAdapter & Spinner
Android App 系統開發教學 Luna 陳雯琳 2014/12/18
第2章 Android界面设计基础 QQ号: QQ群: (Android编程-清华版)
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
實驗四:單位轉換程式.
第7章 Android文件与本地数据库(SQLite)
Chapter 13 Android 實戰演練.
Android + JUnit 單元測試 建國科技大學資管系 饒瑞佶 2012/8/19V4.
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
實驗十三:顯示目前經緯度位置.
Ch06 再談選單元件 物件導向系統實務.
使用Android控制Arduino 史先强
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
第8章 Android内容提供者(ContentProvider)应用
Chapter 6 Advanced UI Design.
Chapter 7 Android應用元件 Android應用元件可以幫助我們獲得系統資源訊息(ActivityManager)、提供系統服務(Service)、搜尋系統服務(SearchManager)、監聽Intent訊息(Broadcast Receiver)以及資料共享(ContentProvider和ContentResolver)。
Android介面設計 Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
Chapter 6 進階UI設計.
CH7 佈局、按鈕與文字編輯元件.
Android + Service 建國科技大學 資管系 饒瑞佶.
6.4 Notification 通知栏.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
實驗十四:顯示與控制地圖.
走进编程 程序的顺序结构(二).
辅导课程六.
第3章 Android事件处理 QQ号: QQ群: (Android编程-清华版)
第6章 建立Android使用介面 6-1 介面元件的基礎 6-2 Android的事件處理 6-3 按鈕元件 6-4 文字元件
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
實驗十一:待辦事項程式 (儲存在手機上).
主编:钟元生 赵圣鲁.
SOA – Experiment 2: Query Classification Web Service
Multithread 多執行緒 以GUI為例了解物件以及Event
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
Chapter 5 Basic UI Design.
實驗九:延續實驗八, 製作一個完整音樂播放器
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
補間動畫 (Tween Animation) 靜宜大學資管系 楊子青
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第二章 Java语法基础.
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
Chapter 18 使用GRASP的对象设计示例.
Visual Basic程序设计 第13章 访问数据库
辅导课程十五.
第二章 Java基本语法 讲师:复凡.
RecyclerView and CardView
Android Speech To Text(STT)
_01自己实现简单的消息处理框架模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第2章 Java语言基础.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第二章 Java基础语法 北京传智播客教育
進階UI元件:Spinner與接合器 靜宜大學資管系 楊子青
Presentation transcript:

第四章 Android事件处理机制 QQ群:287966120 Q Q号: 2227351322 倚动软件工厂实验室

4.1主要内容 基于监听的事件处理 基于回调的事件处理 异步任务处理 事件处理 直接绑定到标签 Handler消息处理机制

4.1 结构导图

4.1.1Android的事件处理机制 基于监听的事件处理 基于回调的事件处理 直接绑定到标签 通常做法是重写Android组件特定的回调方法,Android为绝大部分界面组件都提供了事件响应的回调方法,我们只需重写它们即可,由系统根据具体情景自动调用。 直接绑定到标签 主要做法是在界面布局文件中为指定标签设置事件属性,属性值是一个方法的方法名,然后再在Activity中定义该方法,编写具体的事件处理代码。

4.1.1基于监听的事件处理 基于监听的事件处理模型中,主要涉及到三类对象: EventSource(事件源):产生事件的组件即事件发生的场所,如按钮、菜单等; Event(事件):具体某一操作的详细描述,事件封装了操作的相关信息,如果想获得事件源上所发生事件的相关信息,可通过Event对象来取得,例如按键事件按下的是哪个键、触摸事件发生的位置等; EventListener(事件监听器):负责监听用户在事件源上的操作,并对用户的各种操作做出相应的响应,事件监听器中可包含多个事件处理器,一个事件处理器实际上就是一个事件处理方法。

4.1.1基于监听的事件处理 这三类对象如何协同工作呢? 基于监听的事件处理是一种委托式事件处理; 普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器); 当该事件源发生指定的事情时,系统自动生成事件对象,并通知所委托的事件监听器,由事件监听器相应的事件处理器来处理这个事件。

4.1.1基于监听的事件处理 基于监听的事件处理模型

4.1.1基于监听的事件处理 对委托式事件处理的理解: 委托式事件处理就如同生活中我们每个人的能力都有 限,当碰到一些自己处理不了的事情时,就委托给某个机 构或公司来处理。 首先,你需要把你所遇到的事情和要求向对方描述清 楚,这样,他人才能更好地解决问题; 其次,该机构不止处理你一个人的事,会选派具体的 员工来处理这件事。 其中,我们自己就是事件源,你遇到的事情就是事件, 该机构就是事件监听器,具体解决事情的员工就是事件处 理器。

4.1.1基于监听的事件处理 基于监听的事件处理模型的编程步骤: Step1:获取普通界面控件(事件源),即被监听的对象; Step2:实现事件监听器类,该监听器类是一个特殊的 Java类,必须实现一个XxxListerner接口; Step3:调用事件源的setXxxListener方法将事件监听器对 象注册给普通组件(事件源)。

4.1.1基于监听的事件处理 实现事件监听器的四种形式: 内部类形式:将事件监听器类定义为当前类的内部类; 外部类形式:将事件监听器类定义成一个外部类; 类自身作为事件监听器类:让Activity本身实现监听器接口,并实现事件处理方法; 匿名内部类形式:使用匿名内部类创建事件监听器对象。

4.1.1基于监听的事件处理 简易文本编辑器实例

4.1.1基于监听的事件处理 ①先实现程序界面,代码示例TextEditor01 <LinearLayout 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" android:orientation="vertical" > <TextView android:id="@+id/test" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="测试文字,测试文字" /> →总体垂直线性布局 →为文本框添加ID,便于查找 →文本框宽度填充父容器 →文本框高度填充父容器 →文本内容水平居中 →设定文本显示内容

4.1.1基于监听的事件处理 <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:orientation="horizontal" > <TextView android:text="颜色" /> <Button android:id="@+id/red" android:text="红色" /> →左边距为10dp →水平线性布局 →文本框宽度为内容包裹 →文本框高度为内容包裹 →在string 文件中设置颜色 →为按钮添加id →按钮宽度为内容包裹 →按钮高度为内容包裹 →在string 文件中设置颜色

4.1.1基于监听的事件处理 <Button android:id="@+id/green" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="绿色" /> android:id="@+id/blue" android:text="蓝色" /> </LinearLayout> →为按钮添加id →按钮宽度为内容包裹 →按钮高度为内容包裹 →在String中设置颜色 →为按钮添加id →按钮宽度为内容包裹 →按钮高度为内容包裹 →在String中设置颜色

4.1.1基于监听的事件处理 <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:orientation="horizontal" > <TextView android:text="大小" /> <Button android:id="@+id/bigger" android:text="增大" /> →线性布局宽度为内容包裹 →线性布局高度为内容包裹 →左边距为10dp →文本框宽度为内容包裹 →文本框高度为内容包裹 →在String中设置文本 →为按钮设置ID →按钮宽度为内容包裹 →按钮高度为内容包裹 →在String中设置文本

4.1.1基于监听的事件处理 <Button android:id="@+id/smaller" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="缩小" /> </LinearLayout> <LinearLayout android:layout_marginLeft="10dp" android:orientation="horizontal" > <TextView android:text="样式"/> →为按钮设置ID属性 →按钮宽度为内容包裹 →按钮高度为内容包裹 →在string中设置文本 →按钮宽度为内容包裹 →按钮高度为内容包裹 →左边距为10dp →文本框宽度为内容包裹 →文本框高度为内容包裹 →在string中设置文本

4.1.1基于监听的事件处理 <Button android:id="@+id/italic " android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="倾斜" /> android:id="@+id/bold " android:text="加粗" /> android:id="@+id/moren" android:text="默认" /> </LinearLayout> →为按钮设置ID属性 →按钮宽度为内容包裹 →按钮高度为内容包裹 →在string中设置文本 →为按钮设置ID属性 →按钮宽度为内容包裹 →按钮高度为内容包裹 →在string中设置文本 →为按钮设置ID属性 →按钮宽度为内容包裹 →按钮高度为内容包裹 →在string中设置文本

4.1.1基于监听的事件处理 <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:orientation="horizontal" > <TextView android:text="内容"/> <EditText android:id="@+id/content" android:layout_width="200dp" android:layout_height="wrap_content" /> </LinearLayout> →左边距为10dp →文本框宽度为内容包裹 →文本框高度为内容包裹 →在string中设置文本 →为输入框设置ID属性 →输入框宽度为内容包裹 →输入框高度为内容包裹

4.1.1基于监听的事件处理 ②为“红色,绿色,蓝色”三个按钮添加事件监听器,采用内部类的形式实现,代码示例TextEditor01 public class MainActivity extends Activity { private Button red, green, blue; private TextView test; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); red = (Button) findViewById(R.id.red); green = (Button) findViewById(R.id.green); blue = (Button) findViewById(R.id.blue); test = (TextView) findViewById(R.id.test); MyListener myColorListener = new MyListener(); red.setOnClickListener(myColorListener); green.setOnClickListener(myColorListener); blue.setOnClickListener(myColorListener); } →根据ID获取组件 →注册监听器 →注册监听器 →注册监听器

4.1.1基于监听的事件处理 private class MyListener implements OnClickListener { public void onClick(View v) { switch (v.getId()) { case R.id.red: test.setTextColor(Color.RED); break; case R.id.blue: test.setTextColor(Color.BLUE); case R.id.green: test.setTextColor(Color.GREEN); default:break; } →实现监听器的内部类 →判断事件源 →将字体设置为红色 →将字体设置为蓝色 →将字体设置为绿色

4.1.1基于监听的事件处理 使用内部类有两个优势: 使用内部类可以在当前类中复用该监听器类,即多个事件源可以注册同一个监听器; 使用内部类可以自由访问外部类的所有界面控件,内部类实质上是外部类的成员。 内部类形式比较适合于有多个事件源同时注册同一事件监听器的情形。

4.1.1基于监听的事件处理 ③为“增大”和“缩小”按钮添加事件监听器,采用外部类的形式实现,代码示例TextEditor02 public class MainActivity extends Activity { private Button bigger, smaller; private TextView test; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bigger = (Button) findViewById(R.id.bigger); smaller = (Button) findViewById(R.id.smaller); test = (TextView) findViewById(R.id.test); SizeListener outLister = new SizeListener(test); bigger.setOnClickListener(outLister); smaller.setOnClickListener(outLister); } →根据ID获取组件 →创建监听器 →注册监听器 →注册监听器

4.1.1基于监听的事件处理 public class SizeListener implements OnClickListener { private TextView tv; public SizeListener(TextView tv) {this.tv = tv; } public void onClick(View v) { float f=tv.getTextSize(); switch (v.getId()) { case R.id.bigger: f=f+2; break; case R.id.smaller: f=f-2; break; default:break; } if(f>=72){ f=72;} if(f<=8){ f=8; } tv.setTextSize(f); →实现监听器的外部类 →初始化需要传入的控件 →获取当前的字体大小 →判断是增大还是缩小 →字体每次增大2 →字体每次减小2 →判断字体是否大于72 →判断字体是否小于8 →设置字体大小

4.1.1基于监听的事件处理 那么如何在该类中获取到需要改变的控件呢? 在SizeListener的构造方法里传入参数的方式。 SizeListener 是一个外部类,该类实现了OnClickListener接口,可以处理单击事件,但外部类是无法获取到Activity里面的界面控件,也就不能对控件进行设置和更新。 那么如何在该类中获取到需要改变的控件呢? 在SizeListener的构造方法里传入参数的方式。

4.1.1基于监听的事件处理 外部类形式较少见的原因: 事件监听器通常属于特定的GUI(图形用户界面),定义成外部类不利于提高程序的内聚性;

4.1.1基于监听的事件处理 ④为“加粗、倾斜、默认”三个按钮添加事件处理器,采用Activity类本身继承OnClickListener实现,代码示例TextEditor03。 public class MainActivity extends Activity implements OnClickListener { private Button italic, bold, normal; private TextView test; private int flag=0; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); italic = (Button) findViewById(R.id.italic); bold = (Button) findViewById(R.id.bold); normal = (Button) findViewById(R.id.moren); test = (TextView) findViewById(R.id.test); italic.setOnClickListener(this); bold.setOnClickListener(this); normal.setOnClickListener(this); }

4.1.1基于监听的事件处理 flag=0表示默认,flag=1表示倾斜, flag=2表示加粗,flag=3表示既倾斜又加粗 public void onClick(View v) { switch (v.getId()) { case R.id.italic: if(flag==2||flag==3){ test.setTypeface(Typeface.MONOSPACE,Typeface.BOLD_ITALIC); flag=3; }else{test.setTypeface(Typeface.MONOSPACE,Typeface.ITALIC); flag=1;} break; case R.id.bold: if(flag==1||flag==3){ }else{test.setTypeface(Typeface.DEFAULT_BOLD,Typeface.BOLD); flag=2;} case R.id.moren: test.setTypeface(Typeface.MONOSPACE,Typeface.NORMAL); flag=0;break; default:break;} } →判断哪个按钮被单击了 flag=0表示默认,flag=1表示倾斜, flag=2表示加粗,flag=3表示既倾斜又加粗 →单击倾斜按钮 →单击加粗按钮 →单击默认按钮

4.1.1基于监听的事件处理 Activity类本身作为事件监听器,就如同生活中,我们自己刚好能够处理某一件事,不需要委托给他人处理,可以直接在Activity类中定义事件处理器方法,这种形式非常简洁。 不推荐使用的原因: 可能造成程序结构混乱,Activity的主要职责应该是完成界面初始化工作,但此时还需包含事件处理器方法,从而引起混乱; 如果Activity界面类需要实现监听器接口,给人感觉比较怪异。

思考:在上面的程序中,单击事件监听器的具体事件处理器中,并没有接收到事件参数,即我们并没有发现事件的“踪迹”,这是为什么呢? 4.1.1基于监听的事件处理 思考:在上面的程序中,单击事件监听器的具体事件处理器中,并没有接收到事件参数,即我们并没有发现事件的“踪迹”,这是为什么呢? 因为Android对事件监听模型做了进一步的简化:如果事件源触发的事件足够简单、事件里封装的信息比较有限,那无须封装事件对象。而对于见键盘事件、触摸事件等,程序需要获取事件发生的详细信息,如键盘中的哪个键触发的事件,触摸所发生的位置等,对于这种包含更多信息的事件,Android会将事件信息封装成XXXEvent对象,然后传递给事件监听器。

4.1.1基于监听的事件处理 ⑤为文本编辑框添加输入事件监听器,采用匿名内部类的形式来实现,代码示例TextEditor04 public class MainActivity extends Activity { private TextView test; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); test = (TextView) findViewById(R.id.test); final EditText content=(EditText)findViewById(R.id.content); content.setOnEditorActionListener(new OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { test.setText(content.getText().toString()); return true; } }); content应定义为MainActivity的成员变量或者为final修饰的局部变量,否则无法在匿名内部类中访问该变量。

4.1.1基于监听的事件处理 匿名内部类中访问局部成员变量时,该成员变量必须是final修饰的,而对于成员变量则没有这个要求。 大部分时候,事件处理器都没有什么复用价值(可复用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适。实际上,这种形式也是目前使用最广泛的事件监听器形式。

基于监听的事件处理 常见事件监听器接口及其处理方法: 事件 接口 处理方法 描述 单击事件 View.OnClickListener abstract void onClick(View v) 单击组件时触发 View.OnLongClickListener abstract boolean onLongClick (View v) 长按组件时触发 键盘事件 View.OnKeyListener abstract boolean onKey (View v, int keyCode, KeyEvent event) 处理键盘事件 焦点事件 View.OnFocusChangeListener abstract void onFocusChange (View v, boolean hasFocus) 当焦点发生改变时触发 触摸事件 View.OnTouchListener abstract boolean onTouch (View v, MotionEvent event) 产生触摸事件

4.1.1基于监听的事件处理 View类的常见事件监听器注册方法: 方法 描述 注册单击事件 注册长按事件 注册键盘事件 注册焦点改变事件 void setOnClickListener (View.OnClickListener l) 注册单击事件 void setOnLongClickListener (View.OnLongClickListener l) 注册长按事件 void setOnKeyListener(View.OnKeyListener l) 注册键盘事件 void setOnFocusChangeListener (View.OnFocusChangeListener l) 注册焦点改变事件 void setOnTouchListener (View.OnTouchListener l) 注册触摸事件 void setOnCreateContextMenuListener( View.OnCreateContextMenuListener l) 注册上下文菜单事件

休息一下吧