【问题标题】:Android ScrollView jumps up after changing child element visibility更改子元素可见性后,Android ScrollView 会跳起来
【发布时间】:2020-12-10 15:11:02
【问题描述】:

我有一个 ScrollView,其中包含默认情况下可见性设置为 View.GONE 的元素。问题是,每当此可见性从 View.GONE 更改为 View.VISIBLE 时,滚动就会向上跳,如第二张图片所示: https://i.imgur.com/WmRc4M2.png

红色框代表当前滚动位置,蓝色矩形是可见性改变的元素,绿色矩形是我可以参考的某个元素(例如按钮)。我希望我的 ScrollView 能够像第三张图片所示那样工作。如果屏幕上有绿色按钮,则在其上方显示新元素(蓝色元素)后,它也应该在屏幕上可见。有什么想法可以实现吗?

【问题讨论】:

    标签: java android xml


    【解决方案1】:

    好吧,它的行为正是应有的 - 滚动位置在例如距离顶部 200 像素,当新项目改变其可见性时这不会改变

    您应该自己滚动到正确的(新)点,使用scrollTo 方法 - 测量这个新View 的高度并调用scrollView.scrollTo(0, currentScrollY + heightOfNewView)

    请注意,当您更改可见性时,您不能只在下面一行调用scrollTo,您必须等待此View 被测量和绘制。所以你应该打电话给scrollTo,例如

    visibilityChangedView.setVisibility(View.VISIBLE);
    visibilityChangedView.post(new Runnable() {
    
            // this will be called when visibilityChangedView won't have
            // any pending tasks to do, but we just changed visibility,
            // so at first view will be measured and drawn, after that
            // below run() method will be called
    
            @Override
            public void run() {
                int heightOfNewView = visibilityChangedView.getMeasuredHeight();
                int currentScrollY = scrollView.getScrollY();
                scrollView.scrollTo(0, currentScrollY + heightOfNewView);
            }
    );
    

    这种自动滚动有可能以快速跳转的形式对用户可见 - 首先整个视图将绘制为 #2,然后在第二个/一帧之后,它将在新位置重绘,如 #3。我不知道您的内容是如何构建的(Scrollview 中的其余孩子),但我怀疑这应该是 RecyclerView 或至少 ListView 与正确的 Adapter,而不是 ScrollView 与固定布局

    【讨论】:

    • 有什么办法可以避免这种快速跳转吗?
    • 我害怕不,不是通常的ScrollView,它需要包含一些简单的静态可滚动布局。事实上这是可能的,但这需要大量代码,这些代码已经编写好了 - ListViewRecyclerView(首选)和适当的 Adapters 可能适合您的需求,而且这种方法将更节省内存
    • 为了避免快速跳转,我们可以使用smoothScrollTo方法。
    【解决方案2】:

    您可以使用 NestedScrollView。它完成了这项工作。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    将您的scrollView 放入约束布局并将所有约束设置为父级。

    【讨论】:

    • 添加为评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2019-07-23
    相关资源
    最近更新 更多