在我的应用中,FragmentActivity
包含一个简单的ListFragment
,我想保留用户滚动到的位置。我做了以下事情:
private int initialScrollPosition = 0;
private int initialScrollYOffset = 0;
@Override
public void onSaveInstanceState (Bundle outState) {
outState.putInt(SCROLL_POSITION, this.getListView().getFirstVisiblePosition());
View firstVisibleItemView = this.getListView().getChildAt(0);
outState.putInt(SCROLL_Y_OFFSET, (firstVisibleItemView == null) ? 0 : firstVisibleItemView.getTop());
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.restoreState(savedInstanceState);
}
private void restoreState(Bundle savedInstanceState) {
if(savedInstanceState != null
&& savedInstanceState.containsKey(SCROLL_POSITION)) {
this.initialScrollPosition = savedInstanceState.getInt(SCROLL_POSITION);
}
if(savedInstanceState != null
&& savedInstanceState.containsKey(SCROLL_Y_OFFSET)) {
this.initialScrollYOffset = savedInstanceState.getInt(SCROLL_Y_OFFSET);
}
}
@Override
public void onStart () {
super.onStart();
// some other GUI stuff
this.getListView().setSelectionFromTop(this.initialScrollPosition, this.initialScrollYOffset);
}
此解决方案适用于显示方向更改或从我的应用程序的Activity
移动到下一个应用程序。
但是如果我启动应用程序,请滚动一下,返回主页,然后从最近的onActivityCreated
(或savedInstanceState
Bundle
的任何其他回调中恢复应用程序没有被调用,因此状态无法恢复。
因此我有两个问题:
savedInstanceState
回调的情况下恢复后,我该怎么做才能获得onXXXCreated
?非常感谢您的任何见解!
解决方案:
对安德烈来说!我将onSaveInstanceState
更改为:
@Override
public void onSaveInstanceState (Bundle outState) {
this.initialScrollPosition = this.getListView().getFirstVisiblePosition();
View firstVisibleItemView = this.getListView().getChildAt(0);
this.initialScrollYOffset = (firstVisibleItemView == null) ? 0 : firstVisibleItemView.getTop();
outState.putInt(SCROLL_POSITION, this.initialScrollPosition);
outState.putInt(SCROLL_Y_OFFSET, this.initialScrollYOffset);
}
答案 0 :(得分:4)
如果您的应用程序使用最近的应用程序按钮显示在前面,则可能是因为系统尚未完成,因此可能无法重新创建应用程序。在这种情况下,只调用onResume()
和后面的回调。
结论:尝试恢复onResume()
中的位置,将位置存储在onPause()
中(对于未重新创建活动的最近应用切换),从savedInstanceState
捆绑中提取位置(用于重新创建活动的方向更改)。