当前位置: 首页 > 知识库问答 >
问题:

Nougat上NestedScrollView抛出停止错误(API 25)

东门胤
2023-03-14

我对Nexus 5x(7.1.2)和Google Pixel(7.1.1)上Nested ScrollView的抛出有一个奇怪的问题。在其他操作系统版本上,它工作正常。

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

在日志中,这些投掷在速度、方向等方面看起来几乎相同,所以我找不到这个错误的真正原因。

此外,<code>NestedScrollView</code>不一定需要在<code>CoordinatorLayout</code〕内部,它也可以完全没有<code>巢式ScrollingChild</code>。

例如,以下< code>NestedScrollView子级之一会重现此错误:

1)LinearLayout填充TextViews

2)WebView

3) LinearLayout填充了RecyclerViews

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

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>

共有2个答案

柳正志
2023-03-14

根据动画滚动手势训练指南,在使用mScroller后,重写computeScroll()。computeScrollOffset()来计算滚动视图的正确偏移量,我们需要使用:

ViewCompat.postInvalidateOnAnimation(this);

动画下一个滚动。但是,在NestedScrollView视图中,computeScroll()看起来像这样:

public void computeScroll() {
    if (mScroller.computeScrollOffset()) {
    ...     
    }
}

它不请求下一个滚动动画!这意味着在使用mScroller.fling(…)后,computeScroll()方法有时只会被调用一次,并且view不会继续抛出。

为了解决这个问题,我尝试通过以下方式替换computeScroll:

public void computeScroll(){
    if(mScroller.computeScrollOffset()){
       ...
       ViewCompat.postInvalidateOnAnimation(this); 
    }
}

这听起来可能不是一个好的解决方案,但它目前工作得很好。

NestedScrollView的最新版本添加了ViewCompat.postInvalidateOn动画(this)。

施永贞
2023-03-14

因此,这显然是NestedScrollView中的一个错误。我已经对此做了变通,但仍在等待谷歌方面的适当修复。

https://github.com/Dimezis/FlingableNestedScrollView/

编辑:

似乎该问题已在支持库26.0.0-beta2中修复

https://chris.banes.me/2017/06/09/carry-on-scrolling/

编辑2:虽然滚动现在工作得很好,但在我的应用程序中,我可以不断地再现这bug:

https://issuetracker.google.com/issues/37051723

如果有人也遇到它,您可以在提到的线程中找到解决html" target="_blank">方法。

 类似资料:
  • 问题内容: 我有以下代码: 但是,它引发此错误: 谁能告诉我为什么会这样吗? 问题答案: 我相信这是因为相对的路径。“ ../”被认为是恶意的。首先解析本地路径,然后调用。您可以事先解析路径。

  • 我有这个代码: 但是,它会抛出以下错误: 有人能告诉我为什么会这样吗?

  • 当RecycerView有足够的内容可以滚动时,页面看起来很好。但是,当RecycerView为空或没有足够的内容可滚动时,行为是的AppBarLayout子级将继续滚动-这看起来很奇怪。 当NestedScrollView为空时,有没有办法停止AppBarLayout子滚动?

  • 我正在使用mime类型为“video/avc”的对预览数据进行编码,并将编码数据(仅视频,无音频)传递给。muxer似乎运行良好,并创建了一个大小合理的输出文件(即,记录的时间越长,输出文件越大)。但是,当我试图停止多路复用器时,会出现“无法停止多路复用器”错误: 在失败的停止之前,有一些可疑的MPEG4Writer日志消息: 有什么线索导致这一切吗?不确定你还需要什么信息。

  • 我正在使用下面的aws cloudformation模板来启动一个自动缩放组,当我尝试运行cfn init时,它抛出了一个python错误。我已经想尽一切办法来解决这个问题,但现在我完全被难倒了。我得到的错误是: 这是我的云形成模板: 在正确的方向上提供任何帮助或指导都将是了不起的。我尝试过使用不同版本的aws cfn引导,但它们都给了我相同的问题。

  • 当我尝试使用JQuery POST向服务器发送数据时,我得到以下错误。 我做错了什么? 未捕获的TypeError:在e处非法调用(https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js:4:7727)在Ab(https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.