NestedScrollView's fullScroll(View.FOCUS_UP) not working properly

♀尐吖头ヾ 提交于 2019-11-27 03:21:38

问题


I have a NestedScrollView populated with a vertical LinearLayout, which itself has a bunch of children of various view types: multiple TextViews, two static GridViews, and even a FrameLayout to show a Fragment beneath all of this.

When pressing the back button, if the user has scrolled below a certain point, instead of finishing the Activity, the "scrollToTop" method is called:

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

This works in the previous version of my app, which is in the Play Store. But now, after updating my app to target Android Oreo (and updating the support library to version 26.0.2), instead of scrolling to the top, it seems to start scrolling from below the NestedScrollView's original scroll position, and stops where it was. So it just appears as a weird stutter. At some positions, however, it does scroll to the top (albeit very rarely and inconsistently), and others it actually scrolls to the bottom, for what reason I don't understand.

I have been experimenting with view focusability, to no avail. For example, I read that the Static GridViews may interrupt focus while scrolling. I've also tried various different methods to scroll up, such as

scrollview.pageScroll(View.FOCUS_UP);

and

scrollview.smoothScrollTo(0,0);

But nothing seems to work. Is there something wrong with the support library this time around?


回答1:


try this

add android:descendantFocusability="blocksDescendants" to the LinearLayout inside NestedScrollView and this also

to scroll to top of NestedScrollView use this

NestedScrollView.scrollTo(0, 0);

Edit

Use fling() and smoothScrollTo togather

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



回答2:


UPDATE:

Found a better solution. Try this combo:

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

Looks like a hack, but works well on both my devices (tested with Support Library 26.0.0 & 27.0.2). Can be used to scroll smoothly to any other position. Based on the idea that the problem lies in missing update of mLastScrollerY.

Please leave a feedback if it works for you or not.

Original answer:

Hit this issue too.

NestedScrollView.smoothScrollTo(0, 0) worked in Support Library up to 25.4.0, and doesn't work since 26.0.0 up to current 27.0.2. The contents of NestedScrollView doesn't matter (some TextViews are enough).

This bug is already reported twice on Google Issue Tracker. Minimal project to reproduce it can be found on GitHub.

Found two working solutions:

  1. NestedScrollView.scrollTo(0, 0) (see accepted answer, jumps abruptly)
  2. NestedScrollView.fling(-10000) (scrolls smoothly, but appropriate velocity value depends on current position, device, desired scrolling time and so on)

It was not necessary to change focusability in my case.




回答3:


This code works for me.

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



回答4:


It seems to it's finally fixed in 28.0.0 Support lib, so NestedScrollView.smoothScrollTo() works as expected for me



来源:https://stackoverflow.com/questions/46156882/nestedscrollviews-fullscrollview-focus-up-not-working-properly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!