Android:ScrollView无意中滚动到顶部

时间:2015-01-25 21:27:20

标签: android scrollview

我有这样的布局:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ScrollView
        android:id="@+id/scroll_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:fillViewport="true" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            ... 
            other views 
            ... 

            <TextView
                android:id="@+id/text_view_that_can_change"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

        </RelativeLayout>
    </ScrollView>

    <include
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        layout="@layout/btns_ok_cancel" />

</RelativeLayout>

问题,当我向最初空text_view_that_can_change添加文字时 - 我的ScrollView 滚动到顶部
当我为ScrollView / RelativeLayout中的某些视图设置可见性时会发生同样的问题。

我可以使用scrollView.scrollTo(0, yScroll)向后滚动它,但它给出了一个可见的,我必须说,丑陋的混蛋对整个内容。

有什么方法可以阻止这种行为吗?

1 个答案:

答案 0 :(得分:0)

花了几个小时,这就是我发现的。

滚动到顶部是因为内容RelativeLayout由于内容更改而被重新布局。

你应该添加几行来控制这种情况:
1)声明将保持滚动位置的类成员:

int mSavedYScroll;

2)将GlobalLayoutListener添加到主视图(这里是片段的主视图,但这没关系):

    public View onCreateView(...) {
        mView = inflater.inflate(...);
        ...

        mView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (mSavedYScroll != 0) {
                    mScrollContainer.scrollTo(0, mSavedYScroll);
                    mSavedYScroll = 0;
                }
            }
        });
}

3)当您执行某些操作(代码中的任何位置)可能会更改ScrollView的内容时 - 只需保存当前滚动位置:

     mSavedYScroll = mScrollContainer.getScrollY();
     //DO SOMETHING THAT MAY CHANGE CONTENT OF mScrollContainer:
     ...

就是这样!