失去对 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 的输入关注的主要内容,如果未能解决你的问题,请参考以下文章
AndroidTV - 为 X 行自定义 ListRow。失去焦点