假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在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. Rem与Px的转换[转载]

    原文:http://www.w3cplus.com/preprocessor/sass-px-to-rem-with-mixin-and-function.html rem是CSS3中新增加的一个单位 ...

  2. winscp连接虚拟机Linux被拒绝的问题解决方案

    输入了正确的账号密码还出现这个错误 我们需要在虚拟机中配置一下,改成这样就行了

  3. Python连接Oracle数据库

    今天使用Python连接数据库,连接没有问题,就是中文显示乱码,网上找了很多解决方案, 最后选择使用这个 #!/usr/bin/env python # -*- coding:utf-8 -*- #A ...

  4. CSS3属性——“box-flex”

    CSS3的新增属性有很多,其中有一个比较神奇的,通常称为盒子模型布局,不需要把div浮动,也能合理分配.看如下例子: HTML: <div id="box"> < ...

  5. C#调用DLL文件时参数对应表

    Wtypes.h中的非托管类型  非托管 C语言类型    托管类名               说明HANDLE                  void*               Syste ...

  6. MVC 小案例 -- 信息管理

    前几次更新博客都是每次周日晚上到周一,这次是周一晚上开始写,肯定也是有原因的!那就是我的 Tomact 忽然报错,无法启动,错误信息如下!同时我的 win10 也崩了,重启之后连 WIFI 的标志也不 ...

  7. 宏WINAPI和几种调用约定

    在VC SDK的WinDef.h中,宏WINAPI被定义为__stdcall,这是C语言中一种调用约定,常用的还有__cdecl和__fastcall.这些调用约定会对我们的代码产生什么样的影响?让我 ...

  8. SHA安全散列算法简析

    1 SHA算法简介 1.1 概述 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散 ...

  9. 深入浅出多线程——ReentrantLock (一)

    ReentrantLock是一个排它重入锁,与synchronized关键字语意类似,但比其功能更为强大.该类位于java.util.concurrent.locks包下,是Lock接口的实现类.基本 ...

  10. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...