总之,如何在后台堆栈中正确保存片段的实例状态?

总之,如何在后台堆栈中正确保存片段的实例状态?

我在此发现了许多类似问题的例子,但不幸的是,没有一个答案符合我的要求。

我有不同的人像和景观布局,我使用的是后堆栈,这两种方式都阻止了我使用。setRetainState()以及使用配置更改例程的技巧。

我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中。当仅使用活动编写应用程序时,以下内容运行良好:

TextView vstup;@Overridepublic void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.whatever);
    vstup = (TextView)findViewById(R.id.whatever);
    /* (...) */}@Overridepublic void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    state.putCharSequence(App.VSTUP, vstup.getText());}@Overridepublic void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    vstup.setText(state.getCharSequence(App.VSTUP));}

带着Fragment这只在非常特殊的情况下起作用。具体来说,最糟糕的是替换一个片段,将它放在后面的堆栈中,然后在显示新片段时旋转屏幕。据我所知,旧片段没有接到呼叫onSaveInstanceState()当被替换,但仍然以某种方式链接到Activity稍后,当它的View已经不存在了,所以找我的TextView将结果转化为NullPointerException.

同时,我发现保持对我TextViews不是个好主意FragmentS,即使你不介意Activity那样的话,onSaveInstanceState()实际上保存了状态,但是如果我旋转屏幕,问题就会再次出现。两次当碎片被隐藏时onCreateView()不会在新实例中调用。

我想在onDestroyView()变成一些Bundle-类型为类成员元素(实际上是更多的数据,而不仅仅是一个TextView)和储蓄那,那个在……里面onSaveInstanceState()但是还有其他的缺点。主要是,如果碎片目前显示的是,调用这两个函数的顺序是相反的,因此我需要考虑两种不同的情况。必须有一个更清洁和正确的解决方案!


米脂
浏览 513回答 2
2回答

慕村9548890

若要正确保存Fragment你应该做以下几件事:1.在片段中,通过重写来保存实例状态。onSaveInstanceState()和恢复onActivityCreated():@Overridepublic void onActivityCreated(Bundle savedInstanceState) {     super.onActivityCreated(savedInstanceState);     ...     if (savedInstanceState != null) {         //Restore the fragment's state here     }}...@Overridepublic void onSaveInstanceState(Bundle outState) {     super.onSaveInstanceState(outState);     //Save the fragment's state here}2.和重点,在活动中,您必须将片段的实例保存在onSaveInstanceState()和恢复onCreate().public void onCreate(Bundle savedInstanceState) {     ...     if (savedInstanceState != null) {         //Restore the fragment's instance         mContent = getSupportFragmentManager().getFragment(savedInstanceState, "myFragmentName");         ...     }     ...}@Overrideprotected void onSaveInstanceState(Bundle outState) {     super.onSaveInstanceState(outState);     //Save the fragment's instance     getSupportFragmentManager().putFragment(outState, "myFragmentName", mContent);}希望这能帮上忙。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android