添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 拦截返回事件的实例详解 KeyEventAndroid.View.KeyEvent类中定义了一系列的常量和方法,用来描述Android中的 按事件返回有关的常量和方法有。 KeyEvent.KEYCODE_BACK: 表示key类型为返回 KeyEvent.ACTION_DOWN:表示事件为按下key,如果一直按住不放,则会不停产生此事件KeyEvent.ACTION_UP:表示事件为为放开key,一次点击key过程只会调用一次。 public final int getKeyCode():获取此事件对应的key类型。 public f
import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.view.LayoutInflater; imp...
public class PopupWindowUtil { public static boolean isKeyDown(PopupWindow popupWindow) { View content = popupWindow.getContentView(); if (content == null) return false;
protected void popupIN(View v, Window window, LayoutInflater inflater, Context context) { this.context=context; this.window = window; this.inflater = inflater; final i
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); View contentview = inflater.inflate(R.layout.popup, null);
最近在做Xamarin.Forms的程序。在 AndroidApp中默认的是在堆栈Stack中只剩一层的时候,按back会直接退出关闭App。 这样使用起来有误操作会不小心退出。 怎么避免呢?参考这篇文章我尝试了一个这样的方案: 一、先在最外层的Page中重写OnBackButtonPressed函数,如下: protected override bool OnBack...
Android开发中我们常常会遇到需要拦截或屏蔽返回的需求,对拦截后的返回进行特殊操作。 监听返回有两种方式 1、重写OnBackPressed方法 @Override public void onBackPressed() { // 完全由自己控制返回逻辑,系统不再控制,但是有个前提是: // 不要在Activity的onKeyDown或者OnK...
由于客户要求去掉屏幕最下方的NavigationBar中的返回和任务,只保留中间的HOME。查阅代码找了很久,绕了很多弯路,终于找到修改方法,记载一下,与大家一起分享! 文件:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java 函数:pu
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub * event.getRepeatCount() 重复次数,点后退的时候,为了防止点得过快,触发两次后退事件,故做此设置。 * 建议保留这个判断,增强程序
二. 问题尝试 从网上找了很多方法,比如下面这条,试了也是没效果,但好奇的就是它如果不在弹窗中是可以关闭的 InputMethodManager inputMsg = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(inputMsg !=null){
  说到PopupWindow,我个人感觉是又爱又恨,没有深入使用之前总觉得这个东西应该很简单,很好用,但是真正使用PopupWindow实现一些效果的时候总会遇到一些问题,但是即便是人家的api有问题,作为程序员也没有办法,只能去想办法去补救。 下面是我在使用过程中发现的关于PopupWindow的几个痛点:   痛点一:不设置背景就不能响应返回和点击外部消失的,这个我已经有一篇...
Log.d("sendLocation", "纬度>>>>>: "+location.latitude) //单位:度 Log.d("sendLocation", "经度>>>>>: "+location.longitude)//单位:度 Log.d("sendLocation", "时间>>>>>: "+location.time) Log.d("sendLocation", "海拔>>>>>: "+location.altitude)//海拔单位:米 Log.d("sendLocation", "精度>>>>>: "+location.accuracy) //精度单位:米 Log.d("sendLocation", "海拔>>>>>: "+location.bearing) //获取轴承,以度为单位 return location.toString(); }else return "" [/code] 我怎么外面也获取不到这些信息呢 Android获取窗口可视区域大小: getWindowVisibleDisplayFrame() 狂战太刀流: 大佬,这个问题你解决了吗? Java this 关键字用法 CSDN_Rau: 博主逻辑清晰,收益匪浅 Android手动显示和隐藏软键盘方法总结 showSoftInput第一个参数必须要获取焦点才能显示软键盘,就是这个原因导致我的软键盘弹不起来