Sal*_*uts 19 android android-fragmentactivity
我已经看到了一些类似的问题,关于onSaveInstanceState没有被称为Fragments,但在我的情况下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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
暂停活动时(使用后退按钮),onSaveInstanceState永远不会调用,因此,在恢复应用程序时savedInstanceState始终null在onCreate方法内.我尝试添加这样的块:
@Override
public void onPause() {
super.onPause();
onSaveInstanceState(new Bundle());
}
Run Code Online (Sandbox Code Playgroud)
这是在/sf/answers/993664171/中建议的,但是当onSaveInstanceState被调用时,savedInstanceState仍然null在onCreate方法中.我错过了什么?
Ste*_*yle 78
这里的问题是你误解了它是如何onSaveInstanceState工作的.它旨在保存Activity/ Fragment在操作系统因内存或配置更改而需要销毁它的情况下的状态.然后onCreate在Activity/ Fragment返回/重新启动时传回此状态.
在a中Fragment,它们的所有生命周期回调都直接与其父级相关联Activity.因此,onSaveInstanceState被调用的Fragment时候其父Activity已onSaveInstanceState调用.
暂停活动时(使用后退按钮),永远不会调用onSaveInstanceState,因此,在恢复应用程序时,onCreate方法中的savedInstanceState始终为null.
当按下时,用户正在销毁Activity它的子Fragment节点,因此没有理由调用onSaveInstanceState,因为实例正在被销毁.当你重新打开它时Activity,它是一个全新的实例,没有保存的状态,所以Bundle传入的onCreate是null.这与设计完全一致.但是,尝试旋转设备或按下主页按钮,然后您将看到它Activity和它的孩子Fragment已经onSaveInstanceState呼叫,并在onCreate返回时返回.
你添加的黑客,直接调用onSaveInstanceState(new Bundle());内部onPause,是一个非常糟糕的做法,因为你永远不应该直接调用生命周期回调.这样做会使您的应用程序进入非法状态.
如果您真正想要的是让您的数据在应用程序实例之外持续存在,我建议您考虑使用SharedPreferences或数据库来获取更高级的数据.然后,您可以在持久数据onPause()发生变化时保存.
希望这可以帮助.
在接受的答案的更新中:
onSaveInstanceState如果你使用的是ViewPagera FragmentStatePagerAdapter(而不是FragmentPagerAdapter),则可以调用片段
FragmentStatePagerAdapter
当存在大量页面时,此版本的寻呼机更有用,更像列表视图.当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态.与FragmentPagerAdapter相比,这允许寻呼机保持与每个被访问页面相关联的更少的存储器,代价是在页面之间切换时可能具有更多的开销.
别忘了:
使用FragmentPagerAdapter时,主机ViewPager必须具有有效的ID集.
| 归档时间: |
|
| 查看次数: |
21059 次 |
| 最近记录: |