2020-09-29
程序员文章站
2022-08-19 16:23:10
摸鱼学Android 二十三(事件处理机制)1 基于监听的事件处理机制1.1 说明1.2 使用1.2.1 直接用匿名内部类1.2.2 使用内部类1.2.3 使用外部类1.2.4 直接使用Activity作为事件监听器1.2.5 直接绑定到标签2 基于回调的事件处理机制2.1 说明2.2 常见View的回调方法2.3 事件传播顺序1 基于监听的事件处理机制1.1 说明事件监听机制中由事件源,事件,事件监听器三类对象组成,处理流程如下:为某个事件源(组件)设置一个监听器,用于监听用户操作用户的操作,...
摸鱼学Android 二十三(事件处理机制)
1 基于监听的事件处理机制
1.1 说明
事件监听机制中由事件源,事件,事件监听器三类对象组成,处理流程如下:
- 为某个事件源(组件)设置一个监听器,用于监听用户操作
- 用户的操作,触发了事件源的监听器
- 生成了对应的事件对象
- 将这个事件源对象作为参数传给事件监听器
- 事件监听器对事件对象进行判断,执行对应的事件处理器(对应事件的处理方法)
1.2 使用
1.2.1 直接用匿名内部类
setListener后重写onClick方法,复用性不高
button.setOnClickListener(new OnClickListener() {
//重写点击事件的处理方法onClick()
@Override
public void onClick(View v) {
//显示Toast信息
//...
}
});
1.2.2 使用内部类
定义一个内部类实现监听接口,可复用,可访问外部类的所有界面组件
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.btnshow);
//直接new一个内部类对象作为参数
button.setOnClickListener(new BtnClickListener());
}
//定义一个内部类,实现View.OnClickListener接口,并重写onClick()方法
class BtnClickListener implements View.OnClickListener
{
@Override
public void onClick(View v) {
//...
}
}
1.2.3 使用外部类
使用较少,外部类不能直接访问用户界面的组件
public class MyClick implements OnClickListener {
public MyClick(TextView txt)
{
}
@Override
public void onClick(View v) {
//...
}
}
1.2.4 直接使用Activity作为事件监听器
Activity实现监听接口
public class MainActivity extends Activity implements OnClickListener{
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.btnshow);
//直接写个this
button.setOnClickListener(this);
}
//重写接口中的抽象方法
@Override
public void onClick(View v) {
//...
}
}
1.2.5 直接绑定到标签
组件设置onclick属性,在Activity中定义方法myclick(View view)
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮"
android:onClick="myclick"/>
2 基于回调的事件处理机制
2.1 说明
重写组件的回调方法后,在点击事件发生时,组件会处理对应的事件,即事件由事件源自身处理。
2.2 常见View的回调方法
- 在该组件上触发屏幕事件: boolean onTouchEvent(MotionEvent event);
- 在该组件上按下某个按钮时: boolean onKeyDown(int keyCode,KeyEvent event);
- 松开组件上的某个按钮时: boolean onKeyUp(int keyCode,KeyEvent event);
- 长按组件某个按钮时: boolean onKeyLongPress(int keyCode,KeyEvent event);
- 键盘快捷键事件发生: boolean onKeyShortcut(int keyCode,KeyEvent event);
- 在组件上触发轨迹球屏事件: boolean onTrackballEvent(MotionEvent event);
- 当组件的焦点发生改变: protected void onFocusChanged(boolean gainFocus, int direction, Rect previously FocusedRect)(和前面的6个不同,这个方法只能够在View中重写)
2.3 事件传播顺序
监听器优先,然后到View组件自身,再到Activity,返回false时继续传播,true则终止传播。
本文地址:https://blog.csdn.net/qq_23470315/article/details/108863878