我怎样才能让 ViewPager.arrowScroll() 第一次工作?

How can I make ViewPager.arrowScroll() work the first time?

我有一个 ViewPager(使用 FragmentStatePagerAdapter 来分页片段)。用户可以使用 left/right 滑动从一个片段翻到下一个片段;这很好用。我还添加了 <> 按钮用于分页。这些的 onClick 侦听器是使用以下方法实现的:

mViewPager.arrowScroll(View.FOCUS_LEFT);

mViewPager.arrowScroll(View.FOCUS_RIGHT);

这在大多数情况下都有效:当用户点击 <> 时,视图会按预期向左或向右滚动。

但是在第一次点击 > 按钮时,没有任何反应。 我确实听到 "click" 确认点击发生。我有日志语句显示调用了 onClick 侦听器,并且调用了 mViewPager.arrowScroll(View.FOCUS_RIGHT)。我什至通过 arrowScroll() 检查结果 return;是 true!然而没有分页发生。

之后,所有点击 <> 按钮都可以正常工作。

为什么第一次调用 arrowScroll(View.FOCUS_RIGHT) 没有效果,我该如何解决?

我想我可以尝试在第一次调用它两次,但由于我不知道为什么没有发生记录的行为,我不知道这种方法是否会导致某些电话上的双页寻呼或Android 个版本。

更新:一些日志记录

// Before any button taps.
QuestionAdapter: getItem(0)
QuestionAdapter: instantiateItem: position 0
QuestionAdapter: getItem(1)
QuestionAdapter: instantiateItem: position 1
QuestionAdapter: setPrimaryItem: position 0
QuestionAdapter: setPrimaryItem: position 0
// The screen is displaying page 0.
// Now I tap the > button:
QuestionAdapter: setPrimaryItem: position 0
// The screen is still displaying page 0.
// Now I tap the > button again:
QuestionAdapter: getItem(2)
QuestionAdapter: instantiateItem: position 2
QuestionAdapter: setPrimaryItem: position 1
QuestionAdapter: setPrimaryItem: position 1
QuestionAdapter: setPrimaryItem: position 1
// Now the screen displays page 1.

好的,我想我开始弄清楚问题所在了。当我跟踪 ViewPager.arrowScroll(FOCUS_RIGHT) (source code here) 时,看起来它正在做的是首先尝试将焦点向右移动(嗯,也许这解释了为什么参数说 FOCUS_RIGHT!)。

因此,根据当前有焦点的内容,以及它右侧是否有 nextFocus 视图,它只会将焦点移到那里,认为它的工作已完成,并且 return 为 true 表示成功。

只有当右侧没有 nextFocus 视图时,它才会像我希望的那样实际调用 pageRight()。

在我的例子中,当我第一次按下 > 时,currentFocus = this.findFocus() return 为空。然后它调用 nextFocused = FocusFinder.findNextFocus() 并在当前显示的页面上提供一个 ListView。由于 currentFocus 为 null 而 nextFocus 不是(除其他条件外),arrowScroll() 对将焦点设置到 ListView 感到满意。

我第二次点击 >currentFocus = this.findFocus() return ListView,nextFocused = FocusFinder.findNextFocus() 返回 null。因为 nextFocused 为空,所以它不会尝试 nextFocused.requestFocus() 而是调用 pageRight(),这正是我首先想要的。

既然如此,那么符合ViewPager设计的方案是什么?听起来 arrowScroll() 不仅仅用于分页 left/right,就像 left/right 按钮应该做的那样。相反,它的意思是做键盘箭头键应该做的事情;因此得名。

那么什么方法应该仅用于页面left/right,而不考虑当前有或可以获得焦点的内容?

我可以尝试通过在调用 arrowScroll 之前将焦点设置到正确的视图来解决 arrowScroll 的行为,但这似乎是一个问题。有 pageRightpageLeft 方法,它们看起来完全符合我的需要,但它们没有 public,也没有记录!

好吧,pageRightpageLeft 调用 setCurrentItem(mCurItem + or - 1) 来完成他们的工作, public 的方法并记录在案.所以我想我可以将 pageRightpageLeft 的代码复制到我自己的代码中。

这个 API 设计对我来说似乎很奇怪,因为在寻呼机屏幕上有 left/right 按钮是多么普遍,无论焦点如何,它们都被期望为 left/right 页。同样令人沮丧的是 arrowScroll() 和分页 ViewPager left/right 的文档非常模糊。 但无论如何我认为我找到了一个不错的解决方案。