android一早就有过涉猎,但最近才决定系统的去学习下,然后每次学习完都写一篇博客总结,权当充实下生活。好,进入正题。
android的事件处理大体上分为两类,一类是基于回调的事件处理,一类是基于监听器的事件处理。对于后者我们并不陌生,它正是java swing中控件的事件的用法,所以先来说说它。
android的监听器事件处理机制属于一种委派式(Delegation),类比人类社会的分工协作,比如说我们家里的电器坏了我们通常不会自己修,而是直接打电话通知维修公司来帮我们修。用在程序里就是事件源与事件处理分开执行,这种模型的好处就是可以提高程序的可维护性。
事件监听器的形式有如下几种
1内部类形式:将事件监听器类定义成当前类的内部类。
2 外部类形式:将事件监听器类定义为一个外部类。
3Activity本身作为事件监听器类,让Activity本身实现监听器接口,并实现方法
4匿名内部类形式:使用匿名内部类创建事件监听器的对象。
下面一一列举以上的例子(只做说明故不写布局文件)
1内部类形式:
public class EventQs extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_qs); //获取应用程序中的bn按钮 Button bn=(Button)findViewById(R.id.bn); //为按钮绑定时间监听器 bn.setOnClickListener(new MyListener()); } //定义事件监听器 class MyListener implements View.OnClickListener { //实现监听器类唏嘘实现的方法 @Override public void onClick(View arg0) { EditText txt=(EditText)findViewById(R.id.txt); txt.setText("bn被按钮单机了") } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.event_qs, menu); return true; } }
外部类作为事件监听器- -这个就这么简单
public class TestListener implements OnLongClickListener { @Override public boolean onLongClick(View arg0) { return false; } }
Activity本身作为事件监听器
public class ActivityListener extends Activity { Button bn; @Override public void onCreate(Bundle save) { super.onCreate(save); bn=(Button)findViewById(R.id.bn); //使用Activity作为事件监听器 bn.setOnClickListener(this); } @Override public void onClick(View v) { System.out.println("点击了"); } }
匿名内部类作为事件监听器(这种方法应该是我们用的比较多的)
public class ActivityListener extends Activity { Button bn; @Override public void onCreate(Bundle save) { super.onCreate(save); bn=(Button)findViewById(R.id.bn); //使用Activity作为事件监听器 bn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { System.out.println("点击了按钮"); } }); } }
除了上面四种方法,事件监听机制还可以直接绑定到标签,在这里不做说明。
下面说说基于回调的时间处理。
如果说时间监听机制是一种委托式的时间处理,那么回调机制就正好与它想法了,换句话说就是它的事件源和时间执行同为一体。Android为了实现这种机制为所有的gui组件都提供了时间处理的方法,下面来示范下基于回调的时间处理机制。
public class MyButton extends Button { public MyButton(Context context,AttributeSet set) { super(context,set); } @Override public boolean OnKeyDown(int keyCode,KeyEvent event) { super.onKeyDown(keyCode, event); //这里返回为true可以让该事件簿向外扩散 return true; } }
基于回调的事件处理帮我们省了好多的编程工作,而且看起来也比基于监听的时间处理更加美观。