控制具有不确定项目的 ViewGroup 之间的焦点顺序
Control focus order between ViewGroups with uncertain items
我有一个 Android 电视布局,如下图所示。
- 顶部一个PagerSlidingTabStrip,从服务器拉取数据;
- 底部有Fragments的ViewPager,每个fragment有一个横向的RecyclerView。
场景:
当第一个选项卡(tab0)获得焦点时,然后在向下->向右方向按下方向键,item2 在 RecyclerView 中获得焦点,按预期工作;
然后向上方向按方向键,tab4获得焦点,按照默认的焦点搜索顺序
问题:
我的问题是如何让 tab0(最后一个聚焦的标签)获得焦点而不是 tab4。
我知道我们可以通过指定每个视图的行为来定义行为,下一个控件应使用 nextFocusUp、nextFocusUp、nextFocusLeft、nextFocusRight 属性获得焦点。但是对于我来说,如何控制ViewGroup与不确定项之间的焦点顺序。
问题终于解决了,描述如下:
- 在
PagerSlidingTabStrip
中保留最后一个聚焦视图的引用;
- 创建自定义
ViewGroup
,它是 PagerSlidingTabStrip
和 ViewPager
的父视图;
覆盖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);
}
我有一个 Android 电视布局,如下图所示。
- 顶部一个PagerSlidingTabStrip,从服务器拉取数据;
- 底部有Fragments的ViewPager,每个fragment有一个横向的RecyclerView。
场景:
当第一个选项卡(tab0)获得焦点时,然后在向下->向右方向按下方向键,item2 在 RecyclerView 中获得焦点,按预期工作;
然后向上方向按方向键,tab4获得焦点,按照默认的焦点搜索顺序
问题:
我的问题是如何让 tab0(最后一个聚焦的标签)获得焦点而不是 tab4。
我知道我们可以通过指定每个视图的行为来定义行为,下一个控件应使用 nextFocusUp、nextFocusUp、nextFocusLeft、nextFocusRight 属性获得焦点。但是对于我来说,如何控制ViewGroup与不确定项之间的焦点顺序。
问题终于解决了,描述如下:
- 在
PagerSlidingTabStrip
中保留最后一个聚焦视图的引用; - 创建自定义
ViewGroup
,它是PagerSlidingTabStrip
和ViewPager
的父视图; 覆盖
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); }