Fragment中未调用onSaveInstanceState方法

14
我正在用另一个Fragment替换一个Fragment:

我正在用另一个Fragment替换一个Fragment:

    FragmentTransaction transaction = mFragmentManager.beginTransaction();

    transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
    transaction.replace(R.id.main_container, nextFragment, nextFragment.getClass().toString());
    transaction.addToBackStack(nextFragment.getClass().toString());
    transaction.commit();

然而,正在被替换的片段,它的onSaveInstanceState方法没有被调用。我做错了什么?

2个回答

12

2
那么在这种情况下,我的选择是什么? - 0xSina
你是想用 onSaveInstanceState() 做什么? - kgmaize
3
在我的项目中,我正在展示一种逐步形式的流程。每个步骤都在一个片段中。当用户按下“下一步”时,我会通过上面的代码显示下一个片段(步骤)。然而,当用户按下“返回”时,前一个步骤(片段)会出现,但是它是一个新实例。这就是为什么我正在尝试保存状态,以便在用户继续进行下一步之前,可以向用户展示他输入的内容。 - 0xSina
4
在特定的Fragment类中,你只需使用一个变量来存储需要在用户按下返回键并返回到上一个Fragment时需要持久保存的所有数据。尽管Fragment的视图会被销毁,但Fragment实例实际上并不会在进入下一步骤时被销毁。 - kgmaize
1
@kgmaize,没错,在onCreateView()中我们可以检查savedInstanceStategetArguments()来从Bundle中获取数据。如果我们从第二个片段返回(Activity没有被销毁),则会调用onCreateView()saveInstanceState == null并且所有变量仍然存在。因此,我们可以检查我们的变量isInitialized == false并获取新值。如果isInitialized == true,则跳过设置新值。 - CoolMind

0

1
这不是一个解决方案。他明确表示:“在onPause内直接调用onSaveInstanceState(new Bundle());是一种非常糟糕的做法”。 - ar34z
如果你查看 @kgmaize 回答中的链接,你会看到和我写的一样的 :D - bebosh
Steven Byle在那个链接中的回答说:“你添加的hack,直接在onPause内调用onSaveInstanceState(new Bundle());是一种非常糟糕的做法,因为你不应该直接调用生命周期回调。这样做可能会使你的应用程序进入非法状态。” - auspicious99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接