Android 拦截返回键事件的实例详解

所属分类: 软件编程 / Android 阅读数: 34
收藏 0 赞 0 分享

Android 拦截返回键事件的实例详解

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;
  }
});

如有疑问请留言或者到本站社区交流讨论,希望通过本文能帮助到大家,感谢阅读,谢谢大家对本站的支持!

更多精彩内容其他人还在看

Android异常 java.lang.IllegalStateException解决方法

这篇文章主要介绍了Android异常 java.lang.IllegalStateException解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Split()字符串分割特殊用法案例详解

本文通过案例的形式给大家详细介绍了android中split()字符串分割特殊用法的知识,非常不错具有参考借鉴价值,感兴趣的朋友参考下
收藏 0 赞 0 分享

Android仿新浪微博启动界面或登陆界面(1)

这篇文章主要为大家详细介绍了Android仿新浪微博启动界面或登陆界面的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android仿新浪微博oauth2.0授权界面实现代码(2)

这篇文章主要为大家详细介绍了Android仿新浪微博oauth2.0授权界面实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android开发中使用sqlite实现新闻收藏和取消收藏的功能

本篇文章主要介绍了sqlite实现新闻收藏和取消收藏功能,主要涉及到oracle数据库方面的内容,对于Android开发sqlite实现收藏和取消功能感兴趣的朋友可以参考下本文
收藏 0 赞 0 分享

Android仿新浪微博分页管理界面(3)

这篇文章主要为大家详细介绍了Android仿新浪微博分页管理界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android UI自定义ListView实现下拉刷新和加载更多效果

这篇文章主要介绍了Android UI自定义ListView实现下拉刷新和加载更多效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android—基于微信开放平台v3SDK开发(微信支付填坑)

这篇文章主要介绍了Android—基于微信开放平台v3SDK开发(微信支付填坑),具有一定的参考价值,有需要的可以了解一下。
收藏 0 赞 0 分享

Android仿新浪微博自定义ListView下拉刷新(4)

这篇文章主要为大家详细介绍了Android仿新浪微博自定义ListView下拉刷新,重点介绍了Adapter的详细代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android控件之使用ListView实现时间轴效果

这篇文章主要介绍了Android基础控件之使用ListView实现时间轴效果的相关资料,本文是以查看物流信息为例,给大家介绍了listview时间轴的实现代码,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多