Android NestedScrollView在牛轧糖上抛出停止错误(API 25)

Android NestedScrollView在牛轧糖上抛出停止错误(API 25),android,scroll,android-support-library,android-7.0-nougat,nestedscrollview,Android,Scroll,Android Support Library,Android 7.0 Nougat,Nestedscrollview,我对Nexus5x(7.1.2)和Google Pixel(7.1.1)上的NestedScrollView fling有一个奇怪的问题。在其他操作系统版本上,它可以正常工作 投掷动画有时会在抬起手指后立即停止。它停滞不前,接下来的几次尝试可能也会停止。 为了复制它,你需要上下投掷几次 在日志中,这些抛出物在速度、方向等方面看起来几乎相同,所以我找不到这个bug的真正原因 另外,nestedScrollingView不一定需要在协调布局中,它也可以根本没有NestedScrollingChild

我对Nexus5x(7.1.2)和Google Pixel(7.1.1)上的NestedScrollView fling有一个奇怪的问题。在其他操作系统版本上,它可以正常工作

投掷动画有时会在抬起手指后立即停止。它停滞不前,接下来的几次尝试可能也会停止。 为了复制它,你需要上下投掷几次

在日志中,这些抛出物在速度、方向等方面看起来几乎相同,所以我找不到这个bug的真正原因

另外,
nestedScrollingView
不一定需要在
协调布局
中,它也可以根本没有
NestedScrollingChild

例如,此错误可通过以下
NestedScrollView
子项之一重现:

1)
LinearLayout
填充
textview

2)
WebView

3)
LinearLayout
填充了
RecyclerViews

我知道
RecyclerView
可能存在的问题,以及
CoordinatorLayout
内部的行为,但这并不相关。 所以请不要提任何问题

recyclerView.getLayoutManager().setAutoMeasureEnabled(true);
recyclerView.setNestedScrollingEnabled(false);
或者诸如此类的事情

代码示例:

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:text="Put a super long text here"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:text="Put a super long text here"/>

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

所以这显然是NestedScrollView中的一个bug。 我已经为此做了一个变通办法,但仍在等待谷歌方面的适当修复

编辑

看起来这个问题在support lib 26.0.0-beta2中得到了修复

编辑2: 虽然现在滚动效果很好,但在我的应用程序中,我可以不断重现此错误:

如果有人也遇到这种情况,您可以在提到的线程中找到解决方法。

根据,在重写computeScroll()时,在使用mScroller.ComputeScrolOffset()计算滚动视图的适当偏移量后,我们需要使用:

ViewCompat.postInvalidateOnAnimation(this);
为下一个卷轴设置动画。 但是,在NestedScrollView中,computeScroll()如下所示:

public void computeScroll() {
    if (mScroller.computeScrollOffset()) {
    ...     
    }
}
它不请求下一个滚动动画!这意味着在使用mScroller.fling(…)之后,computeScroll()方法有时只会被调用一次,而view不会继续使用fling

为了解决此问题,我尝试用以下方式替换computeScroll:

public void computeScroll(){
    if(mScroller.computeScrollOffset()){
       ...
       ViewCompat.postInvalidateOnAnimation(this); 
    }
}
这听起来可能不是一个好的解决方案,但目前效果不错


NestedScrollView的最新版本添加了ViewCompat.postInvalidateOnAnimation(this)。

您是否尝试添加不同的滚动行为?支持库中似乎有一个错误链接来自此响应,他们说您可以“模拟”行为我也可以确认此问题。它很容易复制。只需创建一个嵌套的ScrollView,其中包含任何内容。查看与普通滚动视图的行为差异。当你快速上下滚动时,它通常会立即停止滚动。我将创建一个repo,您可以在其中快速比较两种情况。我已经创建了一个repo,您可以在其中快速测试nestedscrollview和普通scrollview的不同行为。现在应该解决了:这对我帮助很大。谢谢:)support lib 26仍存在问题。足以看到android Studio“ScrollingActivity”创建的android项目和Google IO应用程序本身在滚动时显示错误。