zoukankan      html  css  js  c++  java
  • Android-事件处理机制(待补充)

    http://www.cnblogs.com/plokmju/archive/2013/03/13/2955175.html

    Android有两条事件处理机制

    • 基于监听的事件处理
    • 基于回调的事件处理

    一、基于监听的事件处理

    监听的处理关系到三个对象:

    • Event Source:事件发生的场所,通常时各个组件
    • Event:事件内容
    • Event Listener:事件监听器,负责监听组件上发生的事件,并作出相应的处理

    Android的事件处理机制是一种委派式事件处理方式:普通组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。

    所谓事件监听器,其实就是实现了特定接口的Java类的实例。在程序中实现事件监听器,通常有如下几种形式:

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

    1、外部类形式

      使用顶级类定义事件监听器类的形式比较少见,所以不推荐使用,主要因为如下两个原因:

    •   事件监听器通常属于特定的GUI界面,定义成外部类不利于提高程序的内聚性。
    •   外部类形式的事件监听器不能自由访问创建GUI界面的类中的组件,编程不够简洁。

      使用步骤:

    1.   创建一个新类,实现需要监听事件的监听器接口。
    2.   在使用的时候,给某事件源的特定事件绑定此类。

    示例:

    事件处理类,监听了OnLongClick事件。

    public class Main extends Activity implements OnClickListener{
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button btn=(Button)this.findViewById(R.id.button1);
            btn.setOnClickListener(this);//绑定Activity的OnClick事件
        }
    
        public void onClick(View v) {
            // 事件处理逻辑        
        }
    }

    调用:

    public class Main extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button btn=(Button)this.findViewById(R.id.button1);
            btn.setOnLongClickListener(new SendSmsListener(this));       
        }
    }

    2、Activity本身作为事件监听器类

      这种形式使用Activity本身作为监听器类,只需实现需要的监听器接口,就可以直接在Activity类中定义事件处理方法,这种形式非常简洁。但是这种形式可能造成程序结构混乱,因为Activity的主要职责是完成界面初始化工作。

    示例 :

    public class Main extends Activity implements OnClickListener{
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button btn=(Button)this.findViewById(R.id.button1);
            btn.setOnClickListener(this);//绑定Activity的OnClick事件
        }
    
        public void onClick(View v) {
            // 事件处理逻辑        
        }
    }

    3、直接绑定到XML标签中

      在Android中,可以直接把事件处理绑定到XML标签中。

    示例:

    <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" 
            android:onClick="btnClick"/>

    处理事件:

    public class Main extends Activity{
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);  
        }
    
        public void btnClick(View v) {
            // 事件处理逻辑        
        }
    }

    4、匿名内部类作为事件监听器

      因为大部分时候,事件处理器都是没有复用价值的,因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适。这也是最广泛的用法。

    示例:

    public class Main extends Activity{
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button btn=(Button)this.findViewById(R.id.button1);
            btn.setOnClickListener(new OnClickListener() {            
                public void onClick(View v) {
                    // 事件处理逻辑                
                }
            });       
        }    
    }

    二、基于回调的事件处理

      对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,或者说事件监听器完全消失了。当用户在GUI组件上激发某个事件时,组件自己特定的方法将会负责处理该事件。此处理方法一般会有一个boolean类型的返回值,该返回值用于标识该处理方法是否能完全处理该事件。如果返回true,表明该处理方法已完全处理该事件,该事件不会传播出去。如果返回false,表明该处理方法并未完全处理该事件,该事件会传播出去。

      基于回调的事件处理方式主要用于重写新的组件,继承原组件的类,然后对其事件进行重写。在布局的时候,直接使用重写好的新组件。此时如果触发事件,则由新组件执行处理。(此方式一般不常用)

    示例:

    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);
            //事件处理逻辑
            return true;//表示该事件不会像外扩散
        }
    }

    总结:对于基于监听的事件处理模型来说,事件源和事件监听器是分离的,当事件源上发生特定事件之后,该事件交给事件监听器负责处理;对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,当事件源发生特定事件之后,该事件还是由事件源本身负责处理。

  • 相关阅读:
    sqlHelp.java
    IIS7.0 检测到在集成的托管管道模式下不适用的ASP.NET设置 的解决方法
    [转]安装程序在安装此软件包时遇到一个错误,这可能表示此软件包有错。错误码是29506
    单表中的sql语句
    网页::::无法访问请求的页面,因为该页的相关配置数据无效。
    <authentication mode="Windows"/>
    无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。这个错误很难判断错在哪里,刚开……
    [转] css实现透明度(兼容IE6、IE7、Firefox2.0)
    企业微信机器人消息发送
    阴阳历自动转换工具函数
  • 原文地址:https://www.cnblogs.com/qlky/p/5673456.html
Copyright © 2011-2022 走看看