Android的事件处理机制分为两类
1.基于监听器的事件处理方式:
主要做法是为Android的界面组件捆绑特定的监听器。
- 在基于监听器的事件处理方式下,涉及三类对象:
(1)事件源: 事件发生的场所,通常就是各种组件。
(2)事件: 用户操作了某个组件上的特定动作,触发事件。事件这个对象中,封装相关信息。
(3)事件监听器:针对监听到事件,做响应动作。
- 监听器实现步骤:
(1)获得事件源,即被监听的对象;
(2)实现事件监听器类,此类必须实现一个XxxListener的接口。
(3)调用事件源的setXxxListener方法注册一个监听器实例。
注意事件的对象不一定出现在监听器类定义上。有的时候,发生的事件比较简单,不需要传递事件的对象。有时候,则需要的。
class Mylistener implements OnClickListener
{
public void onClicked(View view){……}; //没有传递事件的对象;
}
class MyListener implments OnKeyListener
{
public boolean onKey(View source,int keyCode,KeyEvent event){……} //传递了事件的对象。
}
- View类中,还包含如下几个内部监听器接口,使用时必须实现这些接口。
View.OnClickListener:负责单击事件。
View.OnCreateContextMenuListener:监听上下文菜单事件的创建事件。
View.onFocusChangeListener:监听焦点改变的监听事件。
View.onKeyListener:按键事件的监听器。
View.onLongClickListener: 监听长单击。
View.onTouchListener:监听触摸事件。
2.基于回调方法的事件处理方式
主要做法是重写Android上对应的组件类中的回调方法。
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);
Log.v("-MyButton-" , "the onKeyDown in MyButton");
//返回false,表明并未完全处理该事件,该事件依然向外扩散
return false;
}
}
- 基于回调的事件传播:
几乎所有基于回调的事件处理方法都由Boolean类型的返回值。当返回true时,说明此处理方法完全处理的
这个事件,此事件不再向外传播。返回false时,则此处理方法不能完全处理此次事件,将事件继续向外传播。
public class Propagation extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bn = (Button)findViewById(R.id.bn);
//为bn绑定事件监听器
bn.setOnKeyListener(new OnKeyListener()
{
@Override
public boolean onKey(View source
, int keyCode, KeyEvent event)
{
//只处理按下键的事件
if (event.getAction() == KeyEvent.ACTION_DOWN)
{
Log.v("-Listener-" , "the onKeyDown in Listener");
}
// 返回false,表明该事件会向外传播
return true;
}
});
}
//重写onKeyDown方法,该方法可监听它所包含的所有组件的按键被按下事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
super.onKeyDown(keyCode , event);
Log.v("-Activity-" , "the onKeyDown in Activity");
//返回false,表明并未完全处理该事件,该事件依然向外扩散
return false;
}
}
组件被按下时刻,首先触发的是此按键捆绑的事件监听器。接着触发此组件的事件回调方法,然后将事件传播 到该组件的所在的activity上并调用activity的对应回调方法.
3.两种事件处理方式的对比:
- 基于监听的方式下,事件监听器和事件源由分开实现,因此具有更好的危害性。Android的事务处理机制保证监听器优先被触发。
- 基于回调函数的方式下,在重写组件本身,提高了内聚性。