在项目中发现,Android Tv开机后,会没有焦点。但是获取焦点的代码是执行过的,也就是说,代码没起作用。这是因为开机后,系统默认是Touch Mode,即触摸模式。此模式下没有焦点。当按遥控器时,退出Touch Mode,焦点出现。所以当我们开机时第一次无论按哪个按键都不会有响应,第二次及以后才会有响应。
解决办法:发送模拟按键事件。
/**
* 开机时系统处于touch mode,需要手动发送一个按键事件。
* @param view
*/
public static void doKeyActionInTouchMode(View view) {
if (view.isInTouchMode()) {
new Thread() {
public void run() {
try {
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP);
inst.setInTouchMode(false);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
view.isInTouchMode() 判断此view是否在Touch Mode。
如果你用的是RecyclerView会发现,数据加载完成后,焦点又消失了,而view.isInTouchMode() 返回的是true,所以需要在RecyclerView 加载数据之后再调用此方法。
**2018.01更新:
设置android:focusableInTouchMode=”true”即可,不需要上面那么麻烦**