一、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);
}
点击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键监听封装