在公司实际TV项目开发apk过程中,Activity的 dispatchKeyEventonKeyDown 响应遥控器按键弹出对话框(DialogFragment、Dialog、AlertDialog)时,出现概率性无法响应到遥控器按键的问题(除Home按键),打印日志大致如下:

ViewRootImpl(27708): Dropping event due to no window focus: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=0, metaState=0, flags=0x8, repeatCount=0, eventTime=24289753, downTime=24289753, deviceId=-1, source=0x101 }按键响应:@Overridepublic boolean dispatchKeyEvent(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN/ACTION_UP) {// showDialog()return true;}}或者@Overridepublic boolean onKeyDown(int keyCode) {if (keyCode == KeyEvent.KEYCODE_BACK) {// showDialogreturn true;}}

目前找到的解决方案是重写Activity的 onKeyUp,不使用 dispatchKeyEventonKeyDown 响应弹出对话框(其他按键响应可以正常使用 dispatchKeyEventonKeyDown):

@Overridepublic boolean onKeyUp(int keyCode) {if (keyCode == KeyEvent.KEYCODE_BACK) {// showDialog()return true;}}

两个注意点:

1、跳转Activity有响应相同的按键可能会出现冲突,比如从Activity A跳转到 Activity B,跳转界面响应的是按键 KeyEvent.KEYCODE_0,而Activity B的 onKeyUp 也有拦截该按键,出现的现象是Activity B的 onKeyUp 被响应了,这里只使用一个标志位延时判断:

public ActivityA extends AppCompatActivity {@Overridepublic boolean onKeyUp(int keyCode) {if (keyCode == KeyEvent.KEYCODE_0) {startActivity(new Intent(this, ActivityB.class);return true;}}}public ActivityB extends AppCompatActivity {private boolean keyUpReady;@Overridepublic void onResume() {super.onResume();Log.i(TAG, "onResume");new Handler().postDelay(new Runnable() {keyUpReady = true;}, 300);}@Overridepublic boolean onKeyUp(int keyCode) {if (!keyUpReady) return super.onKeyUp(keyCode); if (keyCode == KeyEvent.KEYCODE_0) {Log.i(TAG, "onKeyUp");// ...return true;}}}日志打印:onResumeonKeyUp

2、弹出的对话框内部响应拦截的按键统一是按下事件 KeyEvent.ACTION_DOWN 不能使用 KeyEvent.ACTION_UP,防止与Activity的 onKeyUp 按键起冲突。

更多相关文章

  1. Android中AlertDialog实现三种对话框
  2. android 隐藏底部虚拟按键
  3. 【记录】Android监听蓝牙耳机的按键事件
  4. 定制Android设备的关机对话框
  5. Android中的diglog对话框

随机推荐

  1. MySQL日期函数与日期转换格式化函数大全
  2. Mysql根据时间查询日期的优化技巧
  3. mysql授权、启动、启动服务常用命令
  4. C#实现MySQL命令行备份和恢复
  5. MySQL命令行下18个常用命令
  6. 提升MYSQL查询效率的10个SQL语句优化技巧
  7. Android(安卓)App开发基础篇—64位Win10
  8. Android(安卓)Debug Bridge(adb, Android
  9. Android的View和ViewGroup分析
  10. App架构之MVP、MVVM、MVC对比