更改子元素可见性后,Android ScrollView会弹出



我有一个ScrollView,它包含可见性设置为View的元素。默认情况下GONE。问题是,每当视图中的可见性发生变化时。前往查看。可见,如第二张图片所示,滚动向上跳跃:https://i.stack.imgur.com/F2aKS.png

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

好吧,它的行为很糟糕——滚动位置在离顶部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,或者至少是具有适当AdapterListView,而不是具有固定布局的ScrollView

您可以使用NestedScrollView。它完成了任务。

scrollView放入约束布局中,并将所有约束设置为父约束。