不再专注于AndroidTV

时间:2019-05-29 11:43:46

标签: android android-tv android-focus

我在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输出是否有焦点异常,但没有发现任何异常。

我的猜测是焦点被某些东西挡住了,但是我不知道这可能是什么。我将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

初始化按钮,并在按钮上设置按键监听器

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配置中进行设置。