FragmentActivity没有的onSaveInstanceState获取调用(Fragmen

2019-08-21 12:30发布

我看到约了几个类似的问题onSaveInstanceState没有得到呼吁Fragment S,但对我来说Fragment的工作很好,它的主要FragmentActivity这是使用麻烦。

相关的代码看起来非常简单:

public class MyFActivity extends FragmentActivity implements ActionBar.TabListener { 
    String[] allValues; // data to save

    @Override
    protected void onSaveInstanceState (Bundle outState) {
        Log.d("putting it!", allValues.toString());
        outState.putStringArray("allValues", allValues);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            allValues = savedInstanceState.getStringArray("allValues");
            Log.d("getting it!", allValues.toString());
        }
    }
}

当暂停活动(使用后退按钮),在onSaveInstanceState不会被调用,因此, savedInstanceState始终是null的范围内onCreate在恢复的应用方法。 我尝试添加一个块是这样的:

@Override
public void onPause() {
    super.onPause();
    onSaveInstanceState(new Bundle());      
}

该建议在https://stackoverflow.com/a/14195202/362657但同时onSaveInstanceState随后被调用, savedInstanceState保持nullonCreate方法。 我在想什么?

Answer 1:

这里的问题是,你是如何误解onSaveInstanceState作品。 它的目的是保存的状态Activity / Fragment ,所述OS需要摧毁它用于存储器的原因或配置变化的情况下。 然后,这个状态传递回来onCreateActivity / Fragment返回/重新启动。

在一个Fragment中,所有它们的生命周期回调被直接连接到它们的父Activity 。 所以onSaveInstanceState会被调用的Fragment时,其父ActivityonSaveInstanceState调用。

当暂停活动(使用后退按钮),则是的onSaveInstanceState不会调用,因此,savedInstanceState总是在恢复应用程序的onCreate方法内空。

当按下背部,用户被破坏Activity ,因此,其子女Fragment S,所以没有理由骂onSaveInstanceState ,因为实例被销毁。 当您重新打开该Activity ,这是一个全新的实例,没有保存的状态,所以Bundle传入onCreatenull 。 这也正是表现为设计的。 然而,尝试旋转装置或击中主页按钮,然后你会看到Activity及其子Fragment ■找onSaveInstanceState来,在回传onCreate时返回。

您添加的黑客 ,直接调用onSaveInstanceState(new Bundle()); 里面onPause ,是一个非常不好的做法,因为你永远不应该直接调用生命周期回调。 这样做可以把你的应用程序进入非法状态。

如果你真正想要的是你的数据后仍然保持你的应用程序的实例,我建议你考虑使用SharedPreferences或数据库的更高级的数据。 然后,您可以保存持久性数据onPause()或当它改变。

希望这可以帮助。



Answer 2:

在更新接受的答案:

片段的onSaveInstanceState可以,如果你使用的是被称为ViewPagerFragmentStatePagerAdapter (而不是FragmentPagerAdapter

FragmentStatePagerAdapter

当有大量的页面,变得更像一个列表视图这寻呼机的版本是比较有用的。 当页面是不可见的用户,他们的整个片段可能会被破坏,只保留该片段的保存状态。 这允许页面之间切换时相比FragmentPagerAdapter在潜在更大的开销成本的寻呼机举行对每个访问的页面相关联的要少得多的内存。

而且不要忘了:

当使用FragmentPagerAdapter主机ViewPager必须具有有效的ID集。



文章来源: FragmentActivity onSaveInstanceState not getting called