NestedScrollView的fullScroll(View.FOCUS_UP)无法正常工作

时间:2017-09-11 13:27:33

标签: android android-nestedscrollview

我有一个NestedScrollView,其中填充了一个垂直的LinearLayout,它本身有一堆各种视图类型的子项:多个TextViews,两个静态GridViews,甚至还有一个FrameLayout来显示所有这些下面的Fragment。

当按下后退按钮时,如果用户滚动到某个点以下,而不是完成活动,则会调用“scrollToTop”方法:

public static void scrollToTop(final NestedScrollView scrollview) {
    new Handler().postDelayed(new Runnable() {
        public void run() {
            scrollview.fullScroll(NestedScrollView.FOCUS_UP);
        }
    }, 200);
}

这适用于我的应用程序的早期版本,该版本位于Play商店中。但现在,在更新我的应用程序以定位Android Oreo(并将支持库更新到版本26.0.2)之后,它似乎从NestedScrollView的原始滚动位置下方开始滚动,而不是滚动到顶部,并停止它的位置。所以它只是看起来像一个奇怪的口吃。然而,在某些位置,它确实滚动到顶部(尽管非常罕见且不一致),而其他位置实际上滚动到底部,出于什么原因我不明白。

我一直在试验视图的可聚焦性,但无济于事。例如,我读到静态GridViews可能会在滚动时中断焦点。我还尝试了各种不同的方法来向上滚动,例如

scrollview.pageScroll(View.FOCUS_UP);

scrollview.smoothScrollTo(0,0);

但似乎没有任何效果。这次支持库有问题吗?

4 个答案:

答案 0 :(得分:15)

试试这个

android:descendantFocusability="blocksDescendants"添加到LinearLayout内的NestedScrollView,这也是

滚动到NestedScrollView的顶部使用此

NestedScrollView.scrollTo(0, 0);

修改

使用fling()smoothScrollTo收集

nestedScrollView.post(new Runnable() {
   @Override
   public void run() {
      nestedScrollView.fling(0);
      nestedScrollView.smoothScrollTo(0, 0);
   }
});

答案 1 :(得分:14)

<强>更新

找到了更好的解决方案。试试这个组合:

scrollView.fling(0);  // Sets mLastScrollerY for next command
scrollView.smoothScrollTo(0, 0);  // Starts a scroll itself

看起来像是黑客,但在我的两台设备上运行良好(使用支持库26.0.0和27.0.2测试)。可用于平滑滚动到任何其他位置。基于问题在于missing update of mLastScrollerY

如果适合您,请留下反馈。

原始回答:

也遇到了这个问题。

NestedScrollView.smoothScrollTo(0, 0)在支持库中工作到25.4.0,从26.​​0.0到目前的27.0.2不起作用。 NestedScrollView的内容无关紧要(一些TextView就足够了)。

此问题已在Google问题跟踪器上reported twice。可以在GitHub上找到重现它的最小项目。

找到两个有效的解决方案:

  1. NestedScrollView.scrollTo(0, 0)(见接受的答案,突然跳起来)
  2. NestedScrollView.fling(-10000)(滚动顺畅,但适当的速度值取决于当前位置,设备,所需的滚动时间等)
  3. 在我的案例中没有必要改变可聚焦性。

答案 2 :(得分:3)

此代码适用于我。

scrollView.post {
    scrollView.fling(0)
    scrollView.fullScroll(ScrollView.FOCUS_UP)
}

答案 3 :(得分:0)

看来它终于在28.0.0 Support lib中得到了修复,因此NestedScrollView.smoothScrollTo()的工作对我来说是预期的