我有这样的布局:
<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)
向后滚动它,但它给出了一个可见的,我必须说,丑陋的混蛋对整个内容。
有什么方法可以阻止这种行为吗?
答案 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:
...
就是这样!