Android 当视图大小更改时,ScrollView向下滚动

Android 当视图大小更改时,ScrollView向下滚动,android,scrollview,Android,Scrollview,我目前有一个带有线性布局的滚动视图。我正在动态地更改一些内容,例如动态地设置一个长文本段落,并添加动态布局(按钮等)。这会导致线性布局的高度发生变化,从而导致滚动视图向下滚动。在动态更新布局时,如何保持当前滚动位置 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_heigh

我目前有一个带有线性布局的滚动视图。我正在动态地更改一些内容,例如动态地设置一个长文本段落,并添加动态布局(按钮等)。这会导致线性布局的高度发生变化,从而导致滚动视图向下滚动。在动态更新布局时,如何保持当前滚动位置

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    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
        android:gravity="center_horizontal"
        >

        <!-- Dynamic Content Here -->
    </LinearLayout>
</ScrollView>


我建议的一个选择是将滚动位置保存在一个捆绑包中并恢复它

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt("xPos", scrollView.getScrollX());
    outState.putInt("yPos", scrollView.getScrollY());
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    int scrollX = savedInstanceState.getInt("xPos"); // Default value 0
    int scrollY = savedInstanceState.getInt("yPos");
    scrollView.scrollTo(scrollX, scrollY);
}

我认为通过以下步骤,您可以做到:

  • 创建从scrollview扩展的自定义滚动视图
  • 定义用于启用和禁用滚动的布尔属性
  • 检查onScollChanged方法上的布尔变量,如果为true,则返回false
  • 在将动态视图添加到其容器之前,将布尔变量设置为true
  • 添加“完成”时将其设置为false

我希望这些能帮助你

试试这个?或者投票让我忘记。。。看看我是否在乎?我可以尝试存储位置,然后恢复,但这意味着我将不得不倾听每个视图的布局,这将变得非常混乱,特别是如果我们考虑用户触摸的话。如果没有其他选择,我会保存这个。我也遇到了同样的问题,我用mjp66@Leo发布的解决方案修复了它,mjp66的答案链接对我有效。在写这篇文章的时候,它是正确的答案,包括我的在内,有220张赞成票。我不确定这是否有效,因为在视图添加到布局后的一段时间调用computeScroll,这意味着我必须再次跟踪布局更改…您希望在加载活动并设置内容视图后动态添加视图吗?或者在将新视图添加到根视图后设置内容视图?我正在加载活动,获取一些数据,然后添加数据,并将动态视图添加到布局中。