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键监听封装
- Android的事件处理
- Android的事件处理
- Android的事件处理
- android的事件处理
- Android的事件处理
- Android事件的处理
- Android 的事件处理
- Android的事件处理
- Android的事件处理
- Android的键盘事件处理
- Android的键盘事件处理
- Android运动事件的处理
- Android的事件处理模式
- android的UI事件处理
- android中事件的处理
- android的触摸事件处理
- Android事件的分派处理
- android 监听事件的处理
- js特效
- Gradle学习记录
- HashMap的工作原理
- 机器学习之softmax函数
- 大华摄像头java开发之预览
- Android的事件处理
- Angular过滤敏感词
- 894E
- oracle下lag和lead分析函数
- ajax,jquery,json
- 有理有据的揭露百度点击算法
- c语言注释转换项目
- [框架安装趟雷指南]Ubuntu+1060+cuda+cudnn+Keras+TH+TF+MXnet(转自知乎) 附带装mxnet0.9.5版本
- 使用jqueryui的日期控件