控制具有不确定项目的 ViewGroup 之间的焦点顺序

Control focus order between ViewGroups with uncertain items

我有一个 Android 电视布局,如下图所示。

  1. 顶部一个PagerSlidingTabStrip,从服务器拉取数据;
  2. 底部有Fragments的ViewPager,每个fragment有一个横向的RecyclerView。

场景:

当第一个选项卡(tab0)获得焦点时,然后在向下->向右方向按下方向键,item2 在 RecyclerView 中获得焦点,按预期工作;

然后向上方向按方向键,tab4获得焦点,按照默认的焦点搜索顺序

问题:

我的问题是如何让 tab0(最后一个聚焦的标签)获得焦点而不是 tab4。

我知道我们可以通过指定每个视图的行为来定义行为,下一个控件应使用 nextFocusUp、nextFocusUp、nextFocusLeft、nextFocusRight 属性获得焦点。但是对于我来说,如何控制ViewGroup与不确定项之间的焦点顺序。

问题终于解决了,描述如下:

  1. PagerSlidingTabStrip 中保留最后一个聚焦视图的引用;
  2. 创建自定义 ViewGroup,它是 PagerSlidingTabStripViewPager 的父视图;
  3. 覆盖ViewGroup中的dispatchKeyEvent方法:

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (shouldInterceptDownKeyEvent(event) || shouldInterceptUpKeyEvent(event)) {
            if (mTabs.getLastFocusedView() != null) {
                mTabs.getLastFocusedView().requestFocus();
            }
            return true;
        }
        return super.dispatchKeyEvent(event);
    }