假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控件自己特定的方法将会负责处理该事件。
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)
一、View类的常见回调方法
    为了使用回调机制来处理GUI控件上所发生的事件,须要为该组件提供相应的事件处理方法,而Java又是一种静态语言,我们无法为每一个对象动态地加入方法。因此仅仅能通过继承GUI控件类,并重写该类的事件处理方法来实现。
Android平台中。每一个View都有自己处理特定事件的回调方法,我们能够通过重写View中的这些回调方法来实现对应的事件。

二、基于回调的事件处理开发方法

1.自己定义控件的一般步骤
(1)定义自己组件的类名。并让该类继承View类或一个现有的View的子类;
(2)重写父类的一些方法,通常须要提供一个构造器,构造器是创建自己定义控件的基本方式。

当Java代码创建该控件或依据XML布局文件载入并构建界面时都将调用该构造器,依据业务须要重写父类的部分方法。比如onDraw方法,用于实现界面显示,其它方法还有onSizeChanged()、onKeyDown()、onKeyUp()等。

(3)使用自己定义的组件,既可通过Java代码来创建,也能够通过XML布局文件进行创建,须要注意的是在XML布局文件里,该组件的标签是完整的包名+类名,而不再不过原来的类名。
2.源代码实战
实现:自己定义一个button。重写其触摸的回调方法。
(1)MyButton.java:自己定义组件
package com.example.android_event2;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.Toast;
public class MyButton extends Button
{
//构造方法
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
//回调方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
Toast.makeText(getContext(),"您按下了数字:"+keyCode,Toast.LENGTH_SHORT).show();
return true; //返回true,表明该事件不会向外扩散
}
}
(2)layouyt/main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!--方法一:在XML布局文件里创建组件-->
<com.example.android_event2.MyButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="回调測试" />
</LinearLayout>
(3)MainActivity.java:主Activity
package com.example.android_event2;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//方法二:Java代码中配置自己定义组件
}
}
效果演示:

源代码分析:在布局文件里配置自己定义的组件---->
                                                       
            <完整的包名.类名  须要设置的相关属性/>

三、事件处理的传播

1. 基于回调方法事件处理的传播
      差点儿全部基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于标识该处理方法能否全然处理该事件。 假设处理事件的回调方法返回true,表明该处理方法已全然处理该事件,该事件不会传播出去;
假设处理事件的回调方法返回false。表明该处理方法并未全然处理该事件,该事件将会继续向外传播。

     对于基于回调事件传播而言,某组件上所发生的事情不仅激发该组件上的回调方法。也会触发该组件所在Activity的回调方法(前提是事件能传播到Activity)。
2.源代码实战
实现:自己定义一个button,重写其触摸的回调方法、为其注冊触摸事件监听器并重写它所在Activity上的触摸回调方法,观察事件处理顺序。
(1)MainActivity.java
package com.example.android_event2;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//採用监听模式
Button myButton = (Button)findViewById(R.id.btn);
myButton.setOnKeyListener(new OnKeyListener(){
public boolean onKey(View v, int keyCode, KeyEvent event) {
System.out.println("组件所绑定的事件监听器被触发");
return false;
} });
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
System.out.println("该组件所在的Activity的回调方法onKeyDown被调用");
return false; //返回true,表明该事件不会向外扩散
}
}
(2)MyButton.java
package com.example.android_event2;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.Button;
public class MyButton extends Button
{
//构造方法
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
//回调方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
System.out.println("自己定义组件中的回调方法onKeyDown被调用");
return false; //返回true,表明该事件不会向外扩散
}
}
(3)layout/main.xml
package com.example.android_event2;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.Button;
public class MyButton extends Button
{
//构造方法
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
//回调方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onKeyDown(keyCode, event);
System.out.println("自己定义组件中的回调方法onKeyDown被调用");
return false; //返回true,表明该事件不会向外扩散
}
}

效果演示:

源代码分析:
    通过实验结果可知。当任意按下一个键后。 最先触发的是该组件所绑定的事件监听器,接着才触发该组件提供的事件回调方法。最后才传播到该组件所在的Activity。假设我们让不论什么一个事件处理方法返回了true。那么该事件将不会继续向外传播。

四、直接绑定到标签

    Android提供了一种直接在界面布局文件里为指定标签绑定事件处理方法的机制。对于非常多Android界面控件而言,它们都支持如onClick、onLongClick等属性,这些属性的属性值是一个形如xxx(View
source)方法的方法名。
比如,在布局文件里为button加入单击事件的处理方法例如以下:
<Button
        android:layout_width=”wrap_content”
        android:layout_heigth=”wrap_content”
        android:text=”单击我”
        android:onClick=”clickHandler”/>
1.源代码实战
(1)MainActivity.java
package com.example.android_event3;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (EditText)findViewById(R.id.result);
}
//将clickHandler方法直接绑定到标签
public void clickHandler(View source)
{
text.setText("中华人民共和国万岁。");
}
}
(2)layout/main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="单击我"
android:onClick="clickHandler"/>
<EditText
android:id="@+id/result"
android:inputType="none"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
效果演示:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


Android笔记二十四.Android基于回调的事件处理机制的更多相关文章

  1. Android笔记(六十四) android中的动画——补间动画(tweened animation)

    补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...

  2. Android进阶(二十四)Android UI---界面开发推荐颜色

    Android UI---界面开发推荐颜色   在Android开发过程中,总要给app添加一些背景,个人认为使用纯色调便可以达到优雅的视觉效果. 补充一些常用的颜色值:colors.xml < ...

  3. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  4. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

  5. Android笔记三十四.Service综合实例二

    综合实例2:client訪问远程Service服务 实现:通过一个button来获取远程Service的状态,并显示在两个文本框中. 思路:如果A应用须要与B应用进行通信,调用B应用中的getName ...

  6. Android笔记(七十四) 详解Intent

    我们最常使用Intent来实现Activity之间的转跳,最近做一个app用到从系统搜索图片的功能,使用到了intent的 setType 方法和 setAction 方法,网上搜索一番,发现实现转跳 ...

  7. Android笔记(十四) Android中的基本组件——按钮

    Android中的按钮主要包括Button和ImageButton两种,Button继承自TextView,而ImageButton继承自ImageView.Button生成的按钮上显示文字,而Ima ...

  8. Android笔记(六十五) android中的动画——属性动画(propertyanimation)

    补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...

  9. Android之旅十四 android中的xml文件解析

    在我们做有关android项目的时候,肯定会涉及到对xml文件的解析操作.以下给大家介绍一下xml文件的解析.包括DOM.SAX.Pull以及曾经我们用到的DOM4J和JDOM: 要解析的XML文件: ...

随机推荐

  1. SVN提交文件的时候过滤指定文件

    如果使用TortoiseSVN作为客户端的话,可以在TortoiseSVN右键菜单中的 "设置"(settings)--常规设置(General)--全局忽略样式里设置(Globa ...

  2. SpringMVC知识一锅烩

    Spring简介 SpringMVC和Struts2一样都是属于表现层的框架,将前段发出的请求分发给对应的后端处理器即Controller 处理流程 用户请求被前端控制前拦截,然后根据对应的拦截路径去 ...

  3. [转载] 基于Dubbo的Hessian协议实现远程调用

    转载自http://shiyanjun.cn/archives/349.html Dubbo基于Hessian实现了自己Hessian协议,可以直接通过配置的Dubbo内置的其他协议,在服务消费方进行 ...

  4. Go基础篇【第5篇】: 内置库模块 exec

    Package exec runs external commands. It wraps os.StartProcess to make it easier to remap stdin and s ...

  5. javaweb-1-B/S初论

    一.B/S结构的基本概念 1.什么是动态网页 2.为什么需要动态网页 3.如何实现动态网页 4.为什么学习B/S技术 4.1C/S结构 优点: 1.C/S架构的界面和操作可以很丰富. 2.安全性能可以 ...

  6. python 小白(无编程基础,无计算机基础)的开发之路 day2

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  7. Python argparse模块实现模拟 linux 的ls命令

    python 模拟linux的 ls 命令 sample: python custom_ls.py -alh c:/ 选项: -a ,--all 显示所有文件,包括'.'开头的隐藏文件 -l  列表显 ...

  8. T-SQL的进阶:超越基本级别3:构建相关子查询——701小组

    T-SQL的进阶:超越基本级别3:构建相关子查询 格雷戈里·拉森,2014/03/05 原文链接: http://www.sqlservercentral.com/articles/Stairway+ ...

  9. 如何有效的去使用一款免费的ERP

    现在市场上免费的软件不少,怎么样去使用一款免费产品是很多人比较头疼的事情. 一般使用免费ERP软件的基本都是小企业,没用过想用又舍不得花钱.如果企业有懂数据库这块儿的管理员,那都还好.如果没有,那建议 ...

  10. windows下tensorflow的安装

    一.直接python安装 1.CPU版本: pip3 install --upgrade tensorflow 2.GPU版本:pip3 install --upgrade tensorflow-gp ...