前言
在Android TV的开发中,最麻烦的就是焦点控制问题了,系统的默认行为就是寻找当前按键方向上最近的能获取焦点的控件,虽然部分控件,比如TextView、Button等可以在xml文件中使用android:nextFocusLeft(Right/Up/Down)等来控制下一个拥有焦点的View,但是对于复杂点的,比如GridView就不那么方便了,要实现的功能是当焦点从GridView上离开然后回到GridView默认选中的还是离开时拥有焦点的子View。如下图。当向上进入分类栏时,回到列表还是选中默认的那个View。
实现
实现方法很简单,就是重写GridView的onFocusChanged()方法,当GridView整体失去/获取焦点的时候会被调用。当检测到失去焦点的时候记录下当前位置,然后获取焦点以后再设置即可。
// 最后一次拥有焦点的位置 public int lastSelectItem = 0; @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); if (gainFocus) { setSelection(lastSelectItem == -1 ? 0 : lastSelectItem); } else { lastSelectItem = getSelectedItemPosition(); } Log.i(TAG, "onFocusChanged@gainFocus = " + gainFocus + " lastSelectItem = " + lastSelectItem); }
参考博客:享受技术带来的快乐