Android的事件处理

客官°小女子只卖身不卖艺 2022-06-04 07:29 419阅读 0赞

一、Android事件处理的概述

(一)、概念:
在Android中,我们可以通过事件处理使UI与用户互动(UI Events)。具体形式则是以事件监听器(event listener)的方式來“监听”用户的动作。
Android提供了非常良好的UI事件处理机制。View是绘制UI的类,每个View对象都可以向Android注册一个事件监听器。每个事件监听器都包含一个回调方法(callback method),这个回调方法(callback method)主要的工作就是回应或处理用户的操作。
(二)、Android UI事件处理的两套机制:
1、基于监听和回调的事件处理机制(event listener):
就是为Android中的控件绑定特定的事件监听器。一旦该控件监听到有相应的动作发生,则该动作会触发事件监听器,而该监听器会调用内部的回调方法重点内容做出相应的响应。事件监听器的核心就是它内部包含的回调方法。

2、另外一种UI事件的机制为事件处理器(event handler):event handler与event listener是不一样的处理机制。后续课程中会讲到多线程的Handler、Looper消息传递机制。

(三)、Android种常用的事件监听器及其回调方法(callback method):

  1. View.OnClickListener : onClick() 单击事件
  2. View.OnLongClickListener : onLongClick() 长按事件
  3. View.OnFocusChangeListener : onFocusChange() 焦点改变事件
  4. View.OnKeyListener : onKey() 按键事件
  5. View.OnTouchListener : onTouch() 触摸屏事件
  6. View.OnCreateContextMenuListener : onCreateContextMenu() 创建上下文菜单事件

Android种常用的事件监听器及其回调方法(callback method)
View.OnClickListener : onClick() 单击事件
View.OnLongClickListener : onLongClick() 长按事件
View.OnFocusChangeListener : onFocusChange() 焦点改变事件
View.OnKeyListener : onKey() 按键事件
View.OnTouchListener : onTouch() 触摸屏事件
View.OnCreateContextMenuListener : onCreateContextMenu() 创建上下文菜单事件

常用事件监听类:
1、RadioGroup.OnCheckedChangeListener 单选按钮组的勾选项改变监听器
2、CompoundButton.OnCheckedChangeListener 多选框勾选项改变监听器
3、AdapterView.OnItemSelectedListener 下拉列表框条目被选中监听器
4、AdapterView.OnItemClickListener ListView的条目单击监听器
5、AdapterView.OnItemClickListener GridView的条目单击监听器
6、DatePicker.OnDateChangedListener DatePicker的日期改变监听器
7、AbsListView.OnScrollListener ListView的滑动监听器
8.SeekBar.OnSeekBarChangeListener seekbar的滑动监听器
9.Ratingbar.onRatingBarChangeListener ratingbar的监听器。
10.DatePicker.onDateSetListener datepicker监听器
11.TimePicker.OnTimeSetListenner timepicker监听器
12.OnMultiChoiceClickListener() dialog监听器
13.OnChildClickListener ExpanableListView

其实事件监听器,就是实现了一个特定接口的Java类的实例。
实现事件监听器有几种形式:
1、内部类形式;
2、外部类形式;
3、Activity实现监听器接口,自身作为事件监听器类;
4**、匿名内部类**的形式创建事件监听器,并实现监听器内的方法。(Android开发中常用匿名内部类作为监听器)

扩展:

setOnItemSelectedListener setOnItemClickListener 区别

OnItemSelectedListener.setOnItemSelectedListener()
指的是鼠标获得一个条目的焦点,字面上理解是选择一个条目

OnItemClickListener.setOnItemClickListener()
指的是你单击一个条目。
如果你从鼠标滚动(或者说选择一个条目)过渡到单击一个条目,都会在调用OnItemClickListener.setOnItemClickListener()之前调用一次OnItemSelectedListener.onNothingSelected()。貌似是因为你单击了一个条目之前就默认你没有选择任何条目,所以会触发一个OnItemSelectedListener.onNothingSelected()

有关ListView中数据改变时,怎么办。
在你改变数据的后面加上一句adapter.notifyDataSetChanged(),adapter是Adapter的实例化对象,android自带的可以,你自己写的Adapter也可以

onKeyDown
标准来一个:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

if ((keyCode == KeyEvent.KEYCODE_BACK)) {
//执行操作
return true;
}
return super.onKeyDown(keyCode, event);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (webView.canGoBack()) {
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
webView.goBack(); // goBack()表示返回WebView的上一页面
return true;
}
}
return super.onKeyDown(keyCode, event);
}

API

点击home键后台运行
我们理所当然的想到,监听Home键的方法是:if(keyCode == KeyEvent.KEYCODE_HOME)。但实际上,这样是行不通的,因为此时home键的消息在framework层就已经被拦截,所以,我们在应用中通过此方法是无法监听到Home键的消息的。

使用观察者模式实现来监听实现
HomeWatcher.java

  1. package com.example.homekey;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.IntentFilter;
  6. //android 4.0以后home按键监听方法(观察者模式实现);
  7. /** * Home键监听封装 * @author zlw */
  8. public class HomeWatcher {
  9. static final String TAG = "HomeWatcher";
  10. private Context mContext;
  11. private IntentFilter mFilter;
  12. private OnHomePressedListener mListener;
  13. private InnerRecevier mRecevier;
  14. // 回调接口
  15. public interface OnHomePressedListener {
  16. public void onHomePressed();
  17. public void onHomeLongPressed();
  18. }
  19. public HomeWatcher(Context context) {
  20. mContext = context;
  21. mRecevier = new InnerRecevier();
  22. mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
  23. }
  24. /** * 设置监听 * * @param listener */
  25. public void setOnHomePressedListener(OnHomePressedListener listener) {
  26. mListener = listener;
  27. }
  28. /** * 开始监听,注册广播 */
  29. public void startWatch() {
  30. if (mRecevier != null) {
  31. mContext.registerReceiver(mRecevier, mFilter);
  32. }
  33. }
  34. /** * 停止监听,注销广播 */
  35. public void stopWatch() {
  36. if (mRecevier != null) {
  37. mContext.unregisterReceiver(mRecevier);
  38. }
  39. }

广播接收者

  1. class InnerRecevier extends BroadcastReceiver {
  2. final String SYSTEM_DIALOG_REASON_KEY = "reason";
  3. final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
  4. final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
  5. final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
  6. @Override
  7. public void onReceive(Context context, Intent intent) {
  8. String action = intent.getAction();
  9. if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
  10. String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
  11. if (reason != null) {
  12. // L.i(TAG, "action:" + action + ",reason:" + reason);
  13. if (mListener != null) {
  14. if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
  15. // 短按home键
  16. mListener.onHomePressed();
  17. } else if (reason
  18. .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
  19. // 长按home键
  20. mListener.onHomeLongPressed();
  21. }
  22. }
  23. }
  24. }
  25. }
  26. }
  27. }

MainActivity.java

  1. package com.example.homekey;
  2. import com.example.homekey.HomeWatcher.OnHomePressedListener;
  3. import android.support.v7.app.ActionBarActivity;
  4. import android.os.Bundle;
  5. import android.view.Menu;
  6. import android.view.MenuItem;
  7. import android.widget.Toast;
  8. public class MainActivity extends ActionBarActivity implements OnHomePressedListener{
  9. private HomeWatcher mHomeWatcher;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. }
  15. @Override
  16. protected void onResume() {
  17. mHomeWatcher = new HomeWatcher(this);
  18. mHomeWatcher.setOnHomePressedListener(this);
  19. mHomeWatcher.startWatch();
  20. super.onResume();
  21. }
  22. @Override
  23. protected void onPause() {
  24. super.onPause();
  25. mHomeWatcher.setOnHomePressedListener(null);
  26. mHomeWatcher.stopWatch();
  27. }
  28. @Override
  29. public void onHomePressed() {
  30. Toast.makeText(MainActivity.this, "onHomePressed", Toast.LENGTH_SHORT).show();
  31. }
  32. @Override
  33. public void onHomeLongPressed() {
  34. Toast.makeText(MainActivity.this, "onHomeLongPressed", Toast.LENGTH_SHORT).show();
  35. }
  36. }

源码下载

推荐阅读
利用onUserLeaveHint发送后台运行通知
Android Back Home键监听
Android之Home键监听封装

发表评论

表情:
评论列表 (有 0 条评论,419人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android事件处理

      UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理。 对于基于监听器的事件处理而言,主要