zoukankan      html  css  js  c++  java
  • Android事件处理

      Android提供了强大的事件处理机制,包括两套事件处理机制:

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

    一、基于监听的事件处理

      在事件监听的处理模型中,主要涉及如下三类对象:

    •   Event Source(事件源):事件发生的场所,通常就是各个组件。
    •   Event(事件):事件封装了界面组件换上发生的特定事情。
    •   Event Listener(事件监听器):负责监听事件源所发生的事件,并对各种时间做出相应的相应。

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

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

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

    1、外部类形式

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

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

      使用步骤:

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

    示例:

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

    public class SendSmsListener implements OnLongClickListener {
        
        private Activity act;
        public SendSmsListener(Activity act)
        {
            this.act=act;
        }
        public boolean onLongClick(View arg0) {
            // 事件处理逻辑
            return false;
        }
    }

    调用:

    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;//表示该事件不会像外扩散
        }
    }

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

     

    作者:承香墨影
    如非授权,禁止转载!
  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/plokmju/p/2955175.html
Copyright © 2011-2022 走看看