38

我可以savedInstanceState()在删除片段时保存状态,然后在将片段从返回堆栈中弹出时恢复状态吗?当我从后台堆栈恢复片段时,savedInstanceState 包始终为空。

现在,应用程序流程是:创建片段 -> 删除片段(添加到后台堆栈)-> 从后台堆栈恢复片段(savedInstanceState 包为空)。

以下是相关代码:

public void onActivityCreated(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = getArguments();
    Long playlistId = bundle.getLong(Constants.PLAYLIST_ID);
    int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID);

    if (savedInstanceState == null) {
       selectedVideoNumber = playlistItemId;
    } else {
       selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO");
    }
}

public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber);
    }

我认为问题在于它onSavedInstanceState()在被删除并被添加到后堆栈时永远不会被调用。如果我不能使用 onsavedInstanceState(),还有其他方法可以解决这个问题吗?

4

4 回答 4

7

onSaveInstanceState (不幸的是)在片段的正常回栈重新创建中没有被调用。查看http://developer.android.com/guide/components/fragments.html#Creating以及如何在添加到后台堆栈时保持片段状态的答案?

于 2012-07-09T16:35:55.027 回答
5

我喜欢将我在 onCreateView 返回的视图存储为全局变量,然后当我返回时,我只需检查一下:

if(mBaseView != null) {
        // Remove the view from the parent
        ((ViewGroup)mBaseView.getParent()).removeView(mBaseView);
        // Return it
        return mBaseView;
    }
于 2013-07-25T22:18:00.520 回答
3

问题是片段需要有一个IdTag与之关联才能FragmentManager跟踪它。

至少有 3 种方法可以做到这一点:

  1. 在 xml 布局Id中为您的片段声明一个:

    android:id=@+id/<Id>
    
  2. 如果您的 Fragment 容器ViewId,请使用FragmentTransaction

    FragmentTransaction  add (int containerViewId, Fragment fragment)
    
  3. 如果您的片段不与任何View(例如无头片段)相关联,请给它一个Tag

    FragmentTransaction  add (Fragment fragment, String tag)
    

另外,请参阅此 SO 答案。

于 2014-07-17T21:54:05.000 回答
0

FWIW,我也遇到了这个问题,但在我的情况下,onSaveInstanceState 被正确调用,当智能手机上出现新的活动片段时,我推送了我的状态数据。和你一样,onActivityCreated 被称为 w/ savedInstanceState 始终为空。恕我直言,我认为这是一个错误。

我通过创建一个静态 MyApplication 状态并将数据放在那里相当于“全局变量”来解决它......

于 2013-07-23T16:22:54.513 回答