Android 从后堆栈还原片段时的savedInstanceState
是否可以使用Android 从后堆栈还原片段时的savedInstanceState,android,android-fragments,bundle,back-stack,Android,Android Fragments,Bundle,Back Stack,是否可以使用savedInstanceState()在删除片段时保存状态,然后在从后堆栈弹出片段时恢复状态?当我从后堆栈还原片段时,savedInstanceState bundle始终为null 现在,应用程序流程是:fragment created->fragment removed(添加到后堆栈)->fragment restored from back stack(savedInstanceState bundle为null) 以下是相关代码: public void onActivit
savedInstanceState()
在删除片段时保存状态,然后在从后堆栈弹出片段时恢复状态?当我从后堆栈还原片段时,savedInstanceState bundle始终为null
现在,应用程序流程是:fragment created->fragment removed(添加到后堆栈)->fragment restored from back stack(savedInstanceState bundle为null)
以下是相关代码:
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(不幸的是)在片段的正常后堆栈重新创建中未被调用。查看并在FWIW上找到答案,我也找到了这个,但在我的例子中,正确调用了onSaveInstanceState,当智能手机上出现新的活动片段时,我推送了我的状态数据。与您一样,onActivityCreated被称为w/savedInstanceState always null。我想这是一只虫子
我创建了一个静态MyApplication状态,并将数据放在那里作为“全局变量”的等价物。我喜欢将我返回的视图作为全局变量存储在onCreateView中,然后当我返回时,我只需检查以下内容:
if(mBaseView != null) {
// Remove the view from the parent
((ViewGroup)mBaseView.getParent()).removeView(mBaseView);
// Return it
return mBaseView;
}
问题是片段需要有一个与之关联的
Id
或标记,以便FragmentManager
跟踪它
至少有3种方法可以做到这一点:
在xml布局中,为片段声明一个Id
:
android:id=@+id/<Id>
如果您的片段未与任何视图
(例如无头片段)关联,请为其添加标记
:
FragmentTransaction add (Fragment fragment, String tag)
我不确定这是个好主意。如果保存对视图的引用,是否会破坏视图以释放内存?我实际上不确定,因为我没有运行任何直接测试。然而,我的想法是这样的。在初始化布局中的所有元素时,标准的做法是将这些元素中的大多数设置为全局变量,因此,如果在上面的示例中,由于引用原因,我无法回收基本视图,Android也无法回收这些视图中的任何一个,因此导致了同样的内存问题。如果你需要为不同的方向膨胀不同的视图,这将不起作用。这个解决方案救了我的命。
FragmentTransaction add (Fragment fragment, String tag)