升级至API v26.1.0后AppCompatActivity的onKeyDown不响应硬菜单键
解决targetSdk升级到26后AppCompatActivity的onKeyDown()不响应硬菜单键的问题
这个问题我之前碰到过不少开发者反馈,本质是Android 8.0(API 26)开始对物理菜单键的事件处理逻辑做了调整。在API 26及以上的系统中,AppCompatActivity会默认拦截物理菜单键的事件,将其转为触发overflow菜单(就是右上角那三个点的菜单)的操作,所以你的onKeyDown()方法就收不到这个事件了。
解决方案一:直接重写onMenuKeyDown()方法
从API 11开始,Android就推荐用onMenuKeyDown()来专门处理物理菜单键的事件,替代onKeyDown()里的KEYCODE_MENU判断。你可以直接在你的AppCompatActivity子类里重写这个方法:
@Override public boolean onMenuKeyDown(int keyCode, KeyEvent event) { // 这里添加你原来在onKeyDown()里处理菜单键的逻辑 Log.d("MenuKey", "物理菜单键被按下"); // 如果要自己处理事件,返回true;如果还要让系统继续处理,返回false return true; }
解决方案二:让菜单键事件继续传递到onKeyDown()
如果你不想改原来的onKeyDown()逻辑,也可以重写onMenuKeyDown()并返回false,这样事件就会继续向下传递到onKeyDown():
@Override public boolean onMenuKeyDown(int keyCode, KeyEvent event) { // 返回false,让事件传递到onKeyDown() return false; } // 你的原有onKeyDown()方法就能收到菜单键事件了 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { Log.d("MenuKey", "菜单键事件触发onKeyDown"); return true; } return super.onKeyDown(keyCode, event); }
额外说明
- 为什么其他按键(返回、音量键)正常?因为这些按键的事件处理逻辑在API 26中没有被AppCompatActivity拦截,所以
onKeyDown()能正常收到。 - 你提到按键背光灯亮,说明硬件本身没问题,就是系统层面的事件拦截导致的。
内容的提问来源于stack exchange,提问作者NKoyee
相关产品推荐
相关产品推荐

