savedInstanceState从还原堆栈中恢复片段时
我可以使用savedInstanceState()
来保存删除一个片段时的状态,然后恢复当我从后面堆栈popup片段的状态? 当我从后端堆栈恢复片段时,savedInstanceState bundle始终为空。
现在,应用程序stream是:片段创build – >片段删除(添加到后面的堆栈) – >从后面的堆栈(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(),是否有另一种方法来解决这个问题?
onSaveInstanceState(不幸的是)在正常的堆栈重新创build片段时不会被调用。 检查出http://developer.android.com/guide/components/fragments.html#Creating和答案我怎样才能维护片段状态时,添加到后面的堆栈?;
我喜欢将我在onCreateView中返回的视图存储为全局variables,然后当我返回时,我只需检查:
if(mBaseView != null) { // Remove the view from the parent ((ViewGroup)mBaseView.getParent()).removeView(mBaseView); // Return it return mBaseView; }
问题是片段需要有一个Id
或Tag
,以便FragmentManager
跟踪它。
至less有三种方法可以做到这一点:
-
在xml布局中为你的片段声明一个
Id
:android:id=@+id/<Id>
-
如果您的碎片容器
View
有一个Id
,使用FragmentTransaction :FragmentTransaction add (int containerViewId, Fragment fragment)
-
如果你的片段不与任何
View
(如无头片段)相关联,给它一个Tag
:FragmentTransaction add (Fragment fragment, String tag)
另外,看到这个答案。
FWIW,我也是这样,但是在我的情况下,保存实例状态被正确调用,并且当智能手机上出现新的活动片段时,我推送了状态数据。 和你一样,onActivityCreated被称为w / savedInstanceState总是为空。 恕我直言,我认为这是一个错误。
我通过创build一个静态的MyApplication状态,并把数据放在那里等同于“全局variables”来解决它。