Android页面事件挂接模拟

Java没有C#的引用类型,因此事件的挂接一般都是利用接口来实现,有两种方式:

1)定义一个实现事件接口的类,然后实现接口方法,然后通过将这个类的实例添加到事件监听器里面:

 public class OnClickListenerHdl  implements View.OnClickListener
    {

    	@Override
    	public void onClick(View v) {
    		// TODO 自动生成的方法存根

    	}

    }

使用:

_Button1.setOnClickListener(new OnClickListenerHdl());

2)定义一个匿名式的类来完成:

   _Button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO 自动生成的方法存根

			}

        });

采用第1种方式虽然比较明了,但有一个非常不利的地方,就是页面事件处理的时候会访问其它页面控件,这种方式会增加很多参数的传递。对于页面处理这种方式有一个非常好的设计模式--中介者模式(也叫集市模式),所有页面控件的交互和事件响应都放在一个中介类中(一般是页面对应的Activity).
第2种方式比第一种方式要好,至少代码的聚合度比较高,而且可以访问一定的公共变量,但需要注意的是在事件处理方法中的this并不是指中介Activity.
安卓的视图中的方法绑定机制是最好的
android:onClick="DoClick"
对应的Activity中只要有一个符合规范的DoClick方法。这就跟C#的处理方式差不多,但其实现估计比较曲折,我下面做了一个模拟:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        _MainActivity = this;
        _Abc="hello you are good!";
        _Button1 = (Button)this.findViewById(R.id.button1);
        //注意这里的调用,这个可以在加载XML文件时动态实现.
        _Button1.setOnClickListener(CreateClickListener(this,"DoClick",_Button1));
        _Button1.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO 自动生成的方法存根

			}

        });

    }
    //这个方法对于Click事件来说是通用的,其它事件可以类似处理。
    private OnClickListener CreateClickListener(final Activity Handler,final String MethodName,final View v)
    {
       return new OnClickListener(){
			@Override
			public void onClick(View v) {
				Class<?> theTypeView=null;
				try {
					theTypeView = Class.forName("android.view.View");
				} catch (ClassNotFoundException e1) {
					// TODO 自动生成的 catch 块
					e1.printStackTrace();
				}
				if(theTypeView != null)
				{
			         try {
						Method theClickMethod= Handler.getClass().getMethod(MethodName, theTypeView);
						if(theClickMethod!=null)
						{
							theClickMethod.invoke(Handler, v);
						}
					} catch (NoSuchMethodException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					} catch (IllegalArgumentException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					} catch (InvocationTargetException e) {
						// TODO 自动生成的 catch 块
						e.printStackTrace();
					}
				}

			}
       };
    }
    public void DoClick(View Button2)
    {
       Button theButton2 = (Button)Button2;
       theButton2.setText("hello,"+theButton2.getText());
    }

至于Android是不是采用类似方法处理,就不是很清楚了。但鉴于Java的语言机制,估计也只能这样干。

??

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 19:10:17

Android页面事件挂接模拟的相关文章

JavaScript之jQuery-4 jQuery事件(页面加载后执行、事件处理、事件冒泡、事件对象、模拟操作)

一.jQuery 页面加载后执行 代码执行的时机选择 - $(document).ready()方法和 window.onload事件具有相似的功能,但是在执行时机方面是有区别的 - window.onload 事件是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行 - $(document).ready()方法注册的事件处理程序,在DOM完全加载后就可以调用 - 一般来讲, $(document).ready()的执行要优于window.onload事件 - 需要注意的是,

【转】Android Touch事件传递机制解析

原文地址:http://www.cnblogs.com/runssnail/p/4250549.html 说明:本文在原文地址上有所改动 一.小故事 在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给了自己组员(程序员) 程序员:分派给了自己带的实习生. 实习生:好苦逼,无法分派,怎么办啊?只能自己干了 但是实习生能不能做好,有两种情况了. 情况一:

使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 页面事件与 deferred

在系列的上一篇文章<使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 事件详解>中,Kayo 介绍了除页面事件外的其他 jQuery Mobile 事件,而页面事件由于事件数较多,并且涉及 jQuery 中一个比较复杂的对象 deferred ,因此在本文中单独说明.jQuery Mobile 页面事件使用分为页面加载事件 (Page load events),页面跳转事件 (Page change events),页面显示/隐藏事件 (

关于asp.net中页面事件加载的先后顺序

一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件不会从内容页发送到母版页.同样,也不能在内容页中处理来自母版页控件的事件. 在某些情况下,内容页和母版页中会引发相同的事件.例如,两者都引发 Init 和 Load 事件.引发事件的一般规则是初始化事件从最里面的控件向最外面的控件引发,所有其他事件则从最外面的控件向最里面的控件引发. 请记住,母版页

Android Touch事件传递机制通俗讲解

在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给了自己组员(程序员) 程序员:分派给了自己带的实习生. 实习生:好苦逼,无法分派,怎么办啊?只能自己干了 但是实习生能不能做好,有两种情况了. 情况一: 实习生:经过一段时间的研究,琢磨,熬夜,奋斗,死敲,皇天不负有心人啊,完成了. 后来又来一个类似的任务,也按着这样传递下去了(开发经理->开发组长

页面事件(Init,Load,PreRender)执行顺序

简介 对由 Microsoft® Internet 信息服务 (IIS) 处理的 Microsoft® ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道.HTTP 管道由一系列托管对象组成,这些托管对象按顺序处理请求,并将 URL 转换为纯 HTML 文本.HTTP 管道的入口是 HttpRuntime 类.ASP.NET 结构为辅助进程中的每个 AppDomain 创建一个此类的实例.(请注意,辅助进程为每个当前正在运行的 ASP.NET 应用程序维护一个特定的 Ap

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

Android touch 事件传递机制

前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事件进行拦截.这个时候我们就需要明白android touch 事件传递机制, (2)以前很多时候比较模糊,也许是网上看到也有很多事件传递的相关文章,但我看着头晕,解释不彻底,有的说得一半,总算不满足不满意,于是据我自己的理解来彻底的来整理下具体的是怎么个传递方式,分享给大家,希望大家看到有什么不对的

Android View 事件分发机制 源码解析 (上)

一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~ MyButton [java] view plain copy package com.example.zhy_event03; import android.content.Context; import andr