事件处理分为基于监听机制和基于回调的事件传播,监听事件大部分没有返回值,基于回调的事件传播j几乎都有boolean类型返回值
该返回值用于标识该处理方法能否完全处理该事件。
1: 如果事件处理的回调方法返回true,表明该处理方法已完全处理该事件,该事件不会传播出去。
2:如果事件处理的回调方法返回false,表明该处理方法并未完全处理该事件,该事件会传播出去的。
对于基于回调的事件传播而言,某组件上所发生的事情不仅激发该组件的回调方法,也会触发该组件所在activity的回调
方法——只要事件能传播到该activity.
下面以实例来分析:
首先自定义Button,并且在MyButton中重写了onKeyDown()回调方法,return false
public class MyButton extends Button {public MyButton(Context context) {
super(context);
}
public MyButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
//返回false,表明并未完全处理该事件,该事件依然向外扩散
super.onTouchEvent(event);
if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.i("msg","touch is in myButton");
}
return false;
}
}
Activity的代码如下:
在该activity中为该button绑定事件监听器,并且重写了onKeyDown()
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button1=(Button) findViewById(R.id.mybutton);
button1.setOnTouchListener(new OnTouchListener() {
@Override
//返回false,表明该事件向外传播
if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.i("msg","touch is in listenner");
}
return false;
}
});
}
@Override
//返回false,表明并未完全处理该事件,该事件依然向外扩散
super.onTouchEvent(event);
if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.i("msg","touch is in activity");
}
return false;
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
最后所得的结果是:
由此不难看出,当该组件上发生某个按键被按下的事件时,Android系统最先触发的应该是该按键上绑定的事件监听器
接着才触发该组件提供的事件回调方法,然后还会传播到该组件所有的Activity,但如果我们让任何一个事件处理方法返回true
那么该事件将不会继续向外传播。
如果我们将事件监听器中的return false,改为return true.那么执行结果如下:
如果将MyButton中设置为return true,结果是: