关闭

Android 拦截返回键事件

标签: 返回键KeyEvent事件拦截android
16760人阅读 评论(0) 收藏 举报
分类:

KeyEvent类

Android.View.KeyEvent类中定义了一系列的常量和方法,用来描述Android中的按键事件。
和返回键有关的常量和方法有。
KeyEvent.KEYCODE_BACK: 表示key类型为返回键
KeyEvent.ACTION_DOWN:表示事件为按下key,如果一直按住不放,则会不停产生此事件。
KeyEvent.ACTION_UP:表示事件为为放开key,一次点击key过程只会调用一次。
public final int getKeyCode():获取此事件对应的key类型。
public final int getAction():获取此事件对应的事件类型

Activity中拦截返回键

在Activity的派生类中可以通过重写onKeyDown和onKeyUp这两个方法来拦截返回键。这两个方法的原型为。

public boolean onKeyDown(int keyCode, KeyEvent event);
public boolean onKeyUp(int keyCode, KeyEvent event);

这两个方法都有两个参数,第一个参数为keyCode,即此事件对应的key类型。第二个参数为此事件对象,
通过event可以获取到事件的详细信息。onKeyDown()方法中event.getAction()返回的始终是KeyEvent.ACTION_DOWN,onKeyUp()方法中event.getAction()返回的始终是KeyEvent.ACTION_UP。
如果要拦截返回键,则在两个方法中加入如下代码。

if (keyCode == KeyEvent.KEYCODE_BACK) {
    ...
}

Dialog中拦截返回键

在Dialog中可以通过调用setOnKeyListener()方法来为Dialog增加按键事件的监听。
setOnKeyListener()方法原型为:

public void setOnKeyListener(final OnKeyListener onKeyListener);

此方法有一个参数,参数需要实现OnKeyListener接口。OnKeyListener接口定义如下。

interface OnKeyListener {
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event);
}

onKey()方法包含三个参数,第一个参数是拦截到此事件的对话框对象的引用。第二个参数是此事件对应的keyCode,第三个参数是此事件对象本身。
如果要拦截返回键,则在Dialog中加入如下代码。

setOnKeyListener(new OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK 
            && event.getAction() == KeyEvent.ACTION_UP) {
            ...
        }
        return false;
    }
});

EditText中拦截返回键事件

在EditText中同样可以通过调用setOnKeyListener()方法来为EditText增加按键事件的监听。
setOnKeyListener()方法的使用和Dialog中完全相同。

View中拦截返回键事件

在所有View的派生类对象上都可以调用setOnKeyListener()方法来增加按键事件的监听,不过除了EditText之外,其他View设置了监听并不会起到作用。按键事件产生时并不会分发到View上。

多个拦截事件的冲突与选择

目前在Activity,Dialog和EditText中都可以成功设置拦截事件。如果多个对象设置了拦截事件。则事件只会分发到一个对象上。
通过实验得到如下结论:
1、Dialog优先级最高,如果有一个Activity,Activity中弹出一个Dialog,Dialog中有一个EditText,在Activity,Dialog和EditText中都设置监听,只有Dialog中设置的监听过程能够正确执行。Activity和EditText中的监听过程无法被执行到。
2、Activity优先级次于Dialog,但高于EditText,如果有一个Activity,Activity中有一个EditText,在Activity和EditText中都设置监听,只有Activity中设置的监听过程能够正确执行。EditText中的监听过程无法被执行到。
3、如果当前界面中有PopupWindow,则按返回键后PopupWindow会收到事件通知,并消费(执行dismiss();)。其他设置了监听的对象无法获取到事件通知。(原因是PopupWindow内部布局类PopupViewContainer重写了dispatchKeyEvent()方法)

返回键响应速度限制

当用户在按返回键后,如果界面出现卡顿,导致界面没有立刻完成返回动作,这时用户可能觉得是按下操作没有成功,又再一次按下返回键。这会导致返回事件又一次被调用。当卡顿结束后就出现多次返回的现象。为了避免这种情况出现,可以在拦截返回键的函数中增加时间限制。即如果本次返回事件距离上次处理时间过段,则不处理本次事件。直接return true;消费此次事件。
以对话框中拦截返回键举例,增加返回键响应速度限制的代码如下。

setOnKeyListener(new OnKeyListener() {
    private static final int INTERVAL = 500;   //响应间隔时间
    private long lastReturnTime;               //上次响应返回事件时间
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK 
            && event.getAction() == KeyEvent.ACTION_UP) {
            long curTime = System.currentTimeMillis();
            if (curTime - lastReturnTime > INTERVAL) {
                lastReturnTime = curTime;
                ...
            } else {
                return true;
            }
        }
        return false;
    }
});
5
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android屏蔽返回键

Android屏蔽返回键 @Override public boolean onKeyDown(int keyCode,KeyEvent event){ if(keyC...
  • shenyuanqing
  • shenyuanqing
  • 2015-07-21 12:10
  • 8533

android 细节之禁用返回键

今天项目中需要使用自己actionBar中的返回键,用的方法就是上次我记录下的父亲activity的方法 android.support.PARENT_ACTIVITY 详情请移步:http://...
  • yundomo
  • yundomo
  • 2014-08-13 02:46
  • 7415

Android 屏蔽返回键、菜单键和Home键

//重写 public void onAttachedToWindow() {        this.getWindow().setType(WindowManager.La...
  • Mr_kings
  • Mr_kings
  • 2015-10-30 15:11
  • 3313

android屏蔽返回键,home键以及其他实体按键

屏蔽键重写activiy的两个方法就行 屏蔽返回键 public boolean onKeyDown(int keyCode, KeyEvent event) {     switc...
  • jdsjlzx
  • jdsjlzx
  • 2014-01-26 15:10
  • 8717

Android Activity返回键控制的两种方式

Android Activity返回键监听的两种方式 1、覆写Activity的OnBackPressed方法 官方解释: Called when the activity has detected...
  • QQ774232122
  • QQ774232122
  • 2016-08-08 10:31
  • 8730

Android 屏蔽home,菜单,返回键 解锁,加锁

  • 2015-11-27 11:53
  • 701KB
  • 下载

Android按返回键(后退键)Back键事件捕获的两种方法

package zhangphil.back; import android.support.v7.app.ActionBarActivity; import android.util.Log; i...
  • zhangphil
  • zhangphil
  • 2015-05-13 11:37
  • 13262

Back键和Home键的屏蔽

(1)屏蔽返回键:  重写onBackPressed()即可,不调用超类方法 @Override public void onBackPressed() { // super.onBackPres...
  • codezjx
  • codezjx
  • 2015-05-04 21:16
  • 8779

android dialog屏蔽back返回键的解决方法

需求:activity弹出dialog,按下返回键dialog消失、activity也要finish
  • u014120638
  • u014120638
  • 2016-03-31 15:35
  • 7909

【Android】Android中屏蔽返回键,home键以及其他实体按键

屏蔽键重写activiy的两个方法就行 屏蔽返回键 public boolean onKeyDown(int keyCode, KeyEvent event) {     switch (k...
  • dengjin20104042056
  • dengjin20104042056
  • 2014-12-02 14:32
  • 826
    个人资料
    • 访问:318599次
    • 积分:3234
    • 等级:
    • 排名:第12178名
    • 原创:50篇
    • 转载:1篇
    • 译文:1篇
    • 评论:64条
    博客专栏