zoukankan      html  css  js  c++  java
  • 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的语言机制,预计也仅仅能这样干。

    
  • 相关阅读:
    【推荐】com.alibaba方式xml转json,能将xml的所有属性方法,全部转化为json
    关于使用JAXB读取xml文档转换为java对象报错:类的两个属性具有相同名称com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsExc...
    java正则,将<a或者</a,尖括号后面的字母改成大写
    javaben转xml
    三次握手四次挥手
    RPC接口测试(六)RPC协议解析(重要!重要!重要!)
    os.popen(cmd) 与 os.system(cmd) 的区别
    jmeter测试webSocket接口
    Ubuntu20.04 体验和美化
    API可视化管理平台YApi
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7044598.html
Copyright © 2011-2022 走看看