恢复w / o savedInstanceState后如何恢复片段状态?

时间:2013-04-05 18:16:20

标签: android android-listview android-fragments

在我的应用中,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的任何其他回调中恢复应用程序没有被调用,因此状态无法恢复。

因此我有两个问题:

  1. 在没有savedInstanceState回调的情况下恢复后,我该怎么做才能获得onXXXCreated
  2. 那里的生命周期究竟是什么。我想明白,为什么我的方法失败了。
  3. 非常感谢您的任何见解!

    解决方案:

    对安德烈来说!我将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);
    }
    

1 个答案:

答案 0 :(得分:4)

如果您的应用程序使用最近的应用程序按钮显示在前面,则可能是因为系统尚未完成,因此可能无法重新创建应用程序。在这种情况下,只调用onResume()和后面的回调。

结论:尝试恢复onResume()中的位置,将位置存储在onPause()中(对于未重新创建活动的最近应用切换),从savedInstanceState捆绑中提取位置(用于重新创建活动的方向更改)。