青春须早为,岂能长少年。这篇文章主要讲述Android页面事件挂接模拟相关的知识,希望能为你提供帮助。
java没有C#的引用类型。因此事件的挂接一般都是利用接口来实现,有两种方式:
1)定义一个实现事件接口的类,然后实现接口方法,然后通过将这个类的实例加入到事件监听器里面:
public class OnClickListenerHdlimplements 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的语言机制,预计也仅仅能这样干。
【Android页面事件挂接模拟】
??
推荐阅读
- android.os.NetworkOnMainThreadException
- 原创源码角度分析Android的消息机制系列——ThreadLocal的工作过程
- android:Activity启动模式之singleTask
- Android五天乐(第三天)ListFragment与ViewPager
- Android硬件抽象层(HAL)深入剖析
- SharePoint创建Alternate Access Mapping (AAM)备用訪问映射
- 12+最佳免费动漫流媒体服务平台(无广告烦恼)
- 10款用于更高CPU和GPU时钟频率的最佳超频软件
- 11更有效率的最佳Android主屏幕小工具