失去对 AndroidTV 的输入关注

Posted

技术标签:

【中文标题】失去对 AndroidTV 的输入关注【英文标题】:Losing input focus on 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 输出是否有任何焦点异常,但没有任何异常现象。

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

【问题讨论】:

【参考方案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;
        
    ); 

需要注意的一些关键点:

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

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

【讨论】:

以上是关于失去对 AndroidTV 的输入关注的主要内容,如果未能解决你的问题,请参考以下文章

反应输入文本失去对重新渲染的关注

Bootstrap 模态输入失去对点击的关注

输入字段失去对每个字符类型的关注 - 反应

AndroidTV - 为 X 行自定义 ListRow。失去焦点

使用 redux-form 库在 React 中输入字符后失去对输入字段的关注

片段变化后失去焦点(ANDROID TV)