(一)、概念:
在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的事件处理所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)