当前位置: 移动技术网 > IT编程>移动开发>Android > Android 拦截返回键事件的实例详解

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

爆头哥最新消息,潘提尔,还珠之小璂快跑

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网