Android按键事件KeyEvent监听

QuibblerQuibbler 2020-02-04 约 9 分钟 4019 次阅读

按键KEYCODE

1、onKey

OnKeyListener 监听接口,OnKeyListener只检测控制键,不会检测文本键(数字、字幕、标点等),实现onKey()方法:

private View.OnKeyListener mOnKeyListener = new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            return false;
        }
    };

给指定的控件添加OnKeyListener

view.setOnKeyListener(mOnKeyListener );

注意:

①返回true表示处理完,不再进行Key事件的分发。返回false,表示继续向后面处理,比如输入到EditText中。

②onKey()每次都会收到两次重复的按键编码,一次是KeyEvent.ACTION_DOWN,一次是KeyEvent.ACTION_UP,执行监听一个即可。

③onKey()方法能够同时检测硬件和软件按键事件。

④主页键KEYCODE_HOME、电源键KEYCODE_POWER、任务键KEYCODE_APP_SWITCH普通APP无法检测

应用举例:

软键盘搜索按钮按下自动收起输入法,移除EditText焦点,开始搜索。

@Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            //输入法按下回车键Enter
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                //通过InputMethodManager收起键盘
                mInputMethodManager.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
                //移除EditText焦点
                mEditText.clearFocus();
                //后面可以进行其它业务,比如根据输入内容进行搜索等。
            }
            return true;
        } else {
            return false;
        }
    }


2、onKeyDown

除了给指定的控件添加监听OnKeyListener,还可以在活动页面Activity上进行监听拦截。

重写Activity的onKeyDown()方法,onKeyDown()只能检测4个物理按键:菜单键、返回键、音量+、音量-。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return super.onKeyDown(keyCode, event);
    }

注意:

①onKeyDown只能在Activity中使用,这个方法是Activity类继承KeyEvent中的KeyEvent.Callback回调接口

②onKeyDown顾名思义,没有两次重复的事件,只检测按下这个动作

③onKeyDown只能检测物理按键,不能像OnKeyListener那样检测输入法等软按键。

④返回true不再响应系统动作,截断本次KeyEvent。返回false继续响应系统动作


3、按键监听应用场景

用过很多应用,有些应用按两次返回键才能推出,第一次按返回键,会提示"再按一次返回键退出",这个是怎么做到的呢?就是利用了KeyEvent监听。

3.1、在onKeyDown()中处理

借助一个全局变量记录按下的时刻

//个人观点,时间在1.5s体验比较好
    private static final long TIME_GAPS = 1500;
    //记录上一次按返回键的时刻
    private long mLastPressedBack = -1;

在onKeyDown处理活动页面的返回按键事件:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mLastPressedBack + TIME_GAPS <= System.currentTimeMillis()) {
                mLastPressedBack = System.currentTimeMillis();
                Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
            } else {
                finish();
            }
        }
        return true;
    }

3.2、onBackPressed()

除了在onKeyDown()中处理,还可以在onBackPressed()中专门用来处理返回键按下的逻辑。看看在父类Activity中的原始定义:

/**
      *当活动检测到用户按下返回键时调用。
      *默认实现只是finish当前活动,
      *可以覆盖此设置以执行所需的任何操作。
      */

        可以在这里完成上面的逻辑,不用单独监听返回按键。当返回按键按下时自动调用:

@Override
    public void onBackPressed() {
        if (mLastPressedBack + TIME_GAPS <= System.currentTimeMillis()) {
            mLastPressedBack = System.currentTimeMillis();
            Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
        } else {
            finish();
        }
    }


3.2.1、onBackPressed()拓展

有一些应用按下返回键并不会退出,而是退到后台。通过任务管理器或者再次点击APP可以继续使用,而不是重新打开。也可以在onBackPressed()中添加这个逻辑,很简单,一句话,将Task移至后台:

@Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }

moveTaskToBack(true)将任务移至后台,而不是默认的实现直接finish掉当前Activity。

推荐博客:

        《android KeyEvent中各种值》

        《Android KeyEvent 点击事件分发处理流程》

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w