我怎样才能让 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
的行为,但这似乎是一个问题。有 pageRight
和 pageLeft
方法,它们看起来完全符合我的需要,但它们没有 public,也没有记录!
好吧,pageRight
和 pageLeft
调用 setCurrentItem(mCurItem + or - 1)
来完成他们的工作, 是 public 的方法并记录在案.所以我想我可以将 pageRight
和 pageLeft
的代码复制到我自己的代码中。
这个 API 设计对我来说似乎很奇怪,因为在寻呼机屏幕上有 left/right 按钮是多么普遍,无论焦点如何,它们都被期望为 left/right 页。同样令人沮丧的是 arrowScroll()
和分页 ViewPager left/right 的文档非常模糊。
但无论如何我认为我找到了一个不错的解决方案。
我有一个 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
的行为,但这似乎是一个问题。有 pageRight
和 pageLeft
方法,它们看起来完全符合我的需要,但它们没有 public,也没有记录!
好吧,pageRight
和 pageLeft
调用 setCurrentItem(mCurItem + or - 1)
来完成他们的工作, 是 public 的方法并记录在案.所以我想我可以将 pageRight
和 pageLeft
的代码复制到我自己的代码中。
这个 API 设计对我来说似乎很奇怪,因为在寻呼机屏幕上有 left/right 按钮是多么普遍,无论焦点如何,它们都被期望为 left/right 页。同样令人沮丧的是 arrowScroll()
和分页 ViewPager left/right 的文档非常模糊。
但无论如何我认为我找到了一个不错的解决方案。