【问题标题】:Losing input focus on AndroidTV失去对 AndroidTV 的输入关注
【发布时间】:2019-10-15 00:33:17
【问题描述】:

我在 AndroidTV 上遇到了一个非常奇怪的错误。

我正在应用程序中打开一个AlertDialog,在 10-20% 的情况下,我完全失去了远程输入焦点。全局处理的按钮(例如 HOME)正常工作,但 DPAD、OK 和其他远程按钮无作用。

在 logcat 中,我看到了这个:

W: Cancelling event due to no window focus: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_DPAD_LEFT, scanCode=105, metaState=0, flags=0x28, repeatCount=0, eventTime=4748412, downTime=4748300, deviceId=9, source=0x301 }    
W: Dropping event due to no window focus: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_DPAD_LEFT, scanCode=105, metaState=0, flags=0x8, repeatCount=0, eventTime=4748468, downTime=4748468, deviceId=9, source=0x301 }    
W: Cancelling event due to no window focus: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_DPAD_LEFT, scanCode=105, metaState=0, flags=0x28, repeatCount=0, eventTime=4748570, downTime=4748468, deviceId=9, source=0x301 }

我检查了adb shell dumpsys window 输出是否有任何焦点异常,但没有任何异常现象。

我的猜测是焦点被某些东西挡住了,但我不知道那会是什么。如有任何提示,我将不胜感激。

【问题讨论】:

    标签: android android-tv


    【解决方案1】:

    没有看到您的代码,但这可能是竞争条件问题,因为您提到它是“10-20% 的情况”。你可以有两种方法来弄清楚。 1. 尝试在您的活动中添加日志 onKeyDown 或 onKeyUp 方法,看看当您按下遥控器上的按钮时会发生什么。 2. 启动对话框时调用“yourview.requestFocus()”。请注意,yourview 是对话框的根视图,只需根据您的情况更改为任何内容。

    【讨论】:

      【解决方案2】:

      像这样初始化你的按钮并在你的按钮上设置关键监听器

      yourButton.setOnKeyListener(new View.OnKeyListener() {
              public boolean onKey(View v, int keyCode, KeyEvent event) {
                  if (event.getAction() == KeyEvent.ACTION_DOWN) {
                      if (keyCode == KeyEvent.KEYCODE_ENTER) {
                          // your code here
                          return true;
      
                      } else if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
                          return true;
                      }
      
                      else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
                          return true;
                      }
      
                      else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
                          return true;
                      }
      
                      else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
                          return true;
                      }
                      else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
                          return true;
                      }
                  }
                  return false;
              }
          }); 
      

      需要注意的一些关键点:

      1. 要在设备上执行操作,请使用 DPAD 中心按钮,而在模拟器上进行测试时,请使用 KEYCODE Enter 按钮。

      2. 您的 avd 应该启用 dpad。您可以在 avd 配置中设置这些。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-12
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 2014-01-26
        相关资源
        最近更新 更多