• Android 事件模型


    本文内容

    • 基于监听的事件模型
    • 基于回调的事件模型

    Android 支持两种事件模型,基于监听的事件模型和基于回调的事件模型。

    基于监听的事件模型


    基于监听的事件模型是一种委托式的,更“面向对象”的事件处理,这跟 Java(或 C#)是一样的。

    事件监听处理模型有三个对象:

    • 事件源(Event Source),也就是 GUI 组件。
    • 事件(Event),也就是 Event 对象,GUI 组件上所发生事件的相关信息。
    • 事件监听器(Event Listener),负责监听事件源所发生的事件,并对各种事件做出相应的响应。

    其中,事件源最容易创建,任意 GUI 组件都可以作为事件源;事件的产生无须程序员关心,它是由系统自动产生的;而事件监听器是整个事件处理的核心。

    例如,当按钮被单击时,该监听器被触发,将在文本框内变为“按钮被单击了”。

    public class EventQs extends Activity
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            // 获取应用程序中的bn按钮
            Button bn = (Button) findViewById(R.id.bn);
            // 为按钮绑定事件监听器。
            bn.setOnClickListener(new MyClickListener()); 
        }
     
        // 定义一个单击事件的监听器
        class MyClickListener implements View.OnClickListener
        {
            // 实现监听器类必须实现的方法,该方法将会作为事件处理器
            @Override
            public void onClick(View v)
            {
                EditText txt = (EditText) findViewById(R.id.txt);
                txt.setText("bn按钮被单击了!");
            }
        }
    }

    从这个示例看,事件处理模型的步骤:

    • 事件源,就是 ID为 bn 按钮。
    • 事件监听器,MyClickListener 类就是事件监听器,必须由程序员实现。
    • 注册监听器,只要调用事件源的 setOnClickListener 方法即可。

    这三件事,事件源可以是任何 GUI 组件,不需要太多程序员参与;注册监听也只要一行代码;因此,事件处理的关键就是事件监听器 MyClickListener。

    另外,事件监听器 MyClickListener 本例以一个内部类的形式存在,也可以外部类、Activity 本身作为事件监听器类、匿名内部类。

     

    基于回调的事件模型


    如果说事件监听机制是一种委托式的事件处理,那么回调机制恰恰相反:对于基于回调的事件处理模型,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在 GUI 组件上触发某个事件时,组件自己特定的方法将会负责处理该事件。

    几乎所有基于回调的事件处理方法都有一个 boolean 类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件:

    • 如果返回 true,则表明该处理方法已完全处理该事件,不需要传播
    • 如果返回 false,则表明该处理方法未完全处理该事件,需要传播

    对于基于回调的事件传播而言,某组件上所发生的事件不仅仅触发该组件上的回调方法,也会触发该组件所在的 Activity 的回调方法——只要事件能传播到该 Activity。

    例如,自定义 Button 控件,重构其 onKeyDown 事件。

    public class MyButton extends Button
    {
        public MyButton(Context context, AttributeSet set)
        {
            super(context, set);
        }
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)
        {
            super.onKeyDown(keyCode, event);
            Log.v("-crazyit.org-", "the onKeyDown in MyButton");
            // 返回true,表明该事件不会向外扩散
            return true;
        }
    }

     

    对 Android 基于监听的事件处理来说,主要方法是为 Android GUI 组件绑定特定的事件监听器;而对于基于回调的事件处理,主要做法是重写 Android 组件特定的回调方法。

    如何选择,一般来说,对于基于回调的事件处理可用于一些通用性的事件,这样代码比较简洁;无法使用基于回调的事件处理时,再采用基于监听的事件处理。

     

    下载 内部类作为事件监听器

    下载 外部类作为事件监听器

    下载 Activity本身作为事件监听器

    下载 匿名内部类作为事件监听器

    下载 事件绑定到标签

    下载 自定义 Button 控件重写 onKeyDown 回调事件

    下载 基于回调的事件传播

    下载 重写 onTouchEvent 回调事件

  • 相关阅读:
    【专题总结】奇技淫巧
    【日常摸鱼】WC2021
    【日常摸鱼】牛客挑战赛3
    Ubuntu 使用deepin-wine安装微信
    git如何设置使用代理
    npm速度过慢的解决方案
    HOW TO INSTALL NATIVE HOMEBREW ON AN APPLE SILICON M1 MAC
    JavaScript Math 对象
    ModuleNotFoundError: No module named 'MySQLdb'
    抓取网站, 趴取网站HTML页面
  • 原文地址:https://www.cnblogs.com/liuning8023/p/3791796.html
Copyright © 2020-2023  润新知