ScrollView .scrollTo无法正常工作? 保存ScrollView的位置在旋转

好吧..我必须在这里忽略一些真正简单的东西,但我想我正在尝试做一些基本的事情。只需保留ScrollView的滚动条位置就可以改变方向了…

这是我的onSaveInstanceState和onRestoreInstanceState的代码。sView是ScrollView布局的容器。 在我的scrollview中是一个包含很多textviews的线性布局。

@Override public void onSaveInstanceState(Bundle outState) { //---save whatever you need to persist— outState.putInt("sViewX",sView.getScrollX()); outState.putInt("sViewY",sView.getScrollY()); super.onSaveInstanceState(outState); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); sViewX = savedInstanceState.getInt("sViewX"); sViewY = savedInstanceState.getInt("sViewY"); sView.scrollTo(sViewX, sViewY); } 

如果我使用Restore中的sViewX和sViewY的值设置Toast,则值将保持不变并且是正确的。

编辑:我只是试图做一个sView.scrollTo(0,150); 在我的onCreate ..只是为了看看是否会打开在150px下的活动,而事实并非如此。 我认为我的问题与.scrollTo方法有关。

我想到了。

由于我在我的onCreate使用setText TextViews,调用.scrollTo将无法正常工作。

所以现在我正在使用以下内容:

 sView.post(new Runnable() { @Override public void run() { sView.scrollTo(sViewX, sViewY); } }); 

onRestoreInstanceState()只是提前滚动视图。 这就是为什么发布新的Runnable有帮助,但并非总是如此。 有时甚至必须使用postDelayed()来让它工作。 对于片段,可以使用onViewCreated()来代替:

 @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); sViewX = savedInstanceState.getInt("sViewX"); sViewY = savedInstanceState.getInt("sViewY"); sView.scrollTo(sViewX, sViewY); } 

这是为我工作

 @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(SystemGlobal.SCROLL_Y, mRelativeLayoutMain.getTop()); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); mRelativeLayoutMain.scrollTo(0, savedInstanceState.getInt(SystemGlobal.SCROLL_Y)); } 

对于MVVMCross:

 protected override void OnSaveInstanceState(Bundle outState) { base.OnSaveInstanceState(outState); ScrollView sv = FindViewById<ScrollView>(Resource.Id.dispatchScrollView); int posY = sv.ScrollY; outState.PutInt("scrollY", posY); } protected override void OnRestoreInstanceState(Bundle savedInstanceState) { base.OnRestoreInstanceState(savedInstanceState); ScrollView sv = FindViewById<ScrollView>(Resource.Id.dispatchScrollView); int posY = savedInstanceState.GetInt("scrollY"); sv.Post(new Runnable(new Action(() => sv.ScrollTo(0, posY)))); } 

您应该在绘制组件之前开始滚动,因为滚动不起作用直到不创build组件:

 @Override public void onWindowFocusChanged(boolean hasFocus) { scrollView.scrollTo(.... 

您可以在全局布局callback中滚动您的视图,而不是将滚动操作发送到下一个运行循环:

 @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); sView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { sView.scrollTo(sViewX, sViewY); } } ); }