Android的事件处理

来源:互联网 发布:php object to xml 编辑:程序博客网 时间:2024/06/11 08:44

一、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

package com.example.homekey;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;//android 4.0以后home按键监听方法(观察者模式实现);/** * Home键监听封装 * @author zlw*/   public class HomeWatcher {       static final String TAG = "HomeWatcher";       private Context mContext;       private IntentFilter mFilter;       private OnHomePressedListener mListener;       private InnerRecevier mRecevier;       // 回调接口       public interface OnHomePressedListener {           public void onHomePressed();           public void onHomeLongPressed();       }       public HomeWatcher(Context context) {           mContext = context;           mRecevier = new InnerRecevier();           mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);       }       /**      * 设置监听      *       * @param listener      */       public void setOnHomePressedListener(OnHomePressedListener listener) {           mListener = listener;       }       /**      * 开始监听,注册广播      */       public void startWatch() {           if (mRecevier != null) {               mContext.registerReceiver(mRecevier, mFilter);           }       }       /**      * 停止监听,注销广播      */       public void stopWatch() {           if (mRecevier != null) {               mContext.unregisterReceiver(mRecevier);           }       }

广播接收者

class InnerRecevier extends BroadcastReceiver {           final String SYSTEM_DIALOG_REASON_KEY = "reason";           final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";           final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";           final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";           @Override           public void onReceive(Context context, Intent intent) {               String action = intent.getAction();               if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {                   String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);                   if (reason != null) {   //                    L.i(TAG, "action:" + action + ",reason:" + reason);                       if (mListener != null) {                           if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {                               // 短按home键                               mListener.onHomePressed();                           } else if (reason                                   .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {                               // 长按home键                               mListener.onHomeLongPressed();                           }                       }                   }               }           }       }   }

MainActivity.java

package com.example.homekey;import com.example.homekey.HomeWatcher.OnHomePressedListener;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.Toast;public class MainActivity extends ActionBarActivity implements OnHomePressedListener{    private HomeWatcher mHomeWatcher;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    @Override    protected void onResume() {        mHomeWatcher = new HomeWatcher(this);            mHomeWatcher.setOnHomePressedListener(this);            mHomeWatcher.startWatch();        super.onResume();    }    @Override    protected void onPause() {        super.onPause();        mHomeWatcher.setOnHomePressedListener(null);            mHomeWatcher.stopWatch();      }    @Override    public void onHomePressed() {        Toast.makeText(MainActivity.this, "onHomePressed", Toast.LENGTH_SHORT).show();    }    @Override    public void onHomeLongPressed() {        Toast.makeText(MainActivity.this, "onHomeLongPressed", Toast.LENGTH_SHORT).show();    }}

源码下载



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

原创粉丝点击