Android的事件处理

一、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键监听封装

相关文章

文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win1...
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由main...
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件...
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项...
文章浏览阅读8.9w次,点赞4次,收藏43次。前言:在Android上...
文章浏览阅读1.1w次,点赞4次,收藏17次。Android Studio提供...