Activity销毁时如何保存Fragment状态
2016-02-24 13:19
746 查看
转载请标明出处:
/article/7785344.html;
原文:http://emuneee.com/blog/2013/01/07/saving-fragment-states/
在Android 3.0(SDK 11)以后,Android 出现了一个伟大的功能:如何在你的App中保存和还原你的Framgent数据。
将一个Fragment的引用传递到Bundle中。这个Bundle可以一直保存它的数据,以后通过调用
getFragment(Bundle, String)方法得到一个一样的Fragmet 实例。
取回一个先前通过 putFragment(Bundle, String, Fragment).方法存储的fragment实例。
你也可以通过使用FramgentManager APIs 去保存一个fragment 对应的指针(我感觉叫引用更好) 到bundle中 在以后用到时取出。它也允许你实现这个指针的存储跟取出(还原)。
putFragment
MyFragment 是一个在我应用中创建的Fragment,这个bundle,outState,只是一个简单的bunlde,它将存储你fragment(即MyFragment)对应的引用(指针)。 MyFragment.TAG 是你的fragment指针以后会用到的key值。
GetFragment
我有一个自定义方法(instantiateFragments) ,它会做一到两件事情:当我的应用是冷启动时抓取我的fragment实例 或者 获得现在的MyFragment内容。
我在我的activity中调用instantiateFragments 这个方法,onRestoreInstanceState传入的参数为null时(onCreate 方法通过冷启动触发),当通过热启动触发时,传入的参数为bundle.
当用户旋转设备时,Android 将销毁Activity,并在销毁前触发onSaveInstanceState,允许开发者来
保存数据。一旦activity被重新启动,这个OS 将触发onRestoreInstanceState 恢复开发者旋转前的保存的状态。
我鼓励你继续更深调查Android框架。因为所有类型都有细微的差别,他们将简化Android应用程序开发工作。
/article/7785344.html;
原文:http://emuneee.com/blog/2013/01/07/saving-fragment-states/
在Android 3.0(SDK 11)以后,Android 出现了一个伟大的功能:如何在你的App中保存和还原你的Framgent数据。
它是什么
我再我下一个App开发中期的时候参考Android API时,偶然发现 FragmentManager.putFragment(Bundle, String, Fragment) and FragmentManager.getFragment(Bundle, String) 这两个方法。它们的作用? putFragment
将一个Fragment的引用传递到Bundle中。这个Bundle可以一直保存它的数据,以后通过调用
getFragment(Bundle, String)方法得到一个一样的Fragmet 实例。
getFragment
取回一个先前通过 putFragment(Bundle, String, Fragment).方法存储的fragment实例。
根据我的理解,当你把当前的Fragment放置到bundle中,他会保存一个的指针指向这个fragment的地址;当你调用getFragment()方法时,它将返回你通过putFragment保存的指针对应的Fragment实例。
你也可以通过使用FramgentManager APIs 去保存一个fragment 对应的指针(我感觉叫引用更好) 到bundle中 在以后用到时取出。它也允许你实现这个指针的存储跟取出(还原)。
---Diane Hackborn ,Android 架构师。 [Source](https://groups.google.com/forum/?fromgroups=#!topic/android-developers/NBlMJnMaGbo)
如何去使用它
一个使用这个API的方法是在我的这个Acticity的创建和销毁的时候。自fragment出现以来,我通常用两个Activity来使用它,一个是我的activity,另一个用来设置Fragment。我再我的activity中管理fragment.putFragment
在activity的 onSaveInstanceState 像这样使用:
@Override protected void onSaveInstanceState(Bundle outState) { FragmentManager manager = getFragmentManager(); manager.putFragment(outState, MyFragment.TAG, mMyFragment); }
MyFragment 是一个在我应用中创建的Fragment,这个bundle,outState,只是一个简单的bunlde,它将存储你fragment(即MyFragment)对应的引用(指针)。 MyFragment.TAG 是你的fragment指针以后会用到的key值。
GetFragment
我有一个自定义方法(instantiateFragments) ,它会做一到两件事情:当我的应用是冷启动时抓取我的fragment实例 或者 获得现在的MyFragment内容。
private void instantiateFragments(Bundle inState) { FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); if (inState != null) { mMyFragment = (MyFragment) manager.getFragment(inState, MyFragment.TAG); } else { mMyFragment = new MyFragment(); transaction.add(R.id.fragment, mMyFragment, MyFragment.TAG); transaction.commit(); } }
我在我的activity中调用instantiateFragments 这个方法,onRestoreInstanceState传入的参数为null时(onCreate 方法通过冷启动触发),当通过热启动触发时,传入的参数为bundle.
@Override protected void onRestoreInstanceState(Bundle inState) { instantiateFragments(inState); }
当用户旋转设备时,Android 将销毁Activity,并在销毁前触发onSaveInstanceState,允许开发者来
保存数据。一旦activity被重新启动,这个OS 将触发onRestoreInstanceState 恢复开发者旋转前的保存的状态。
我鼓励你继续更深调查Android框架。因为所有类型都有细微的差别,他们将简化Android应用程序开发工作。
相关文章推荐
- 金蝶二次开发
- bzoj1833 数字计数
- AJAXdemo_sync.html Async = false
- [数据结构]One-Dimensional Life Game
- 让使用了SQLite的.NET应用自适应32位/64位系统
- ICPCCamp 2016 Day 6 - Spb SU and Spb AU Contest(Colored path-dp)
- 使用POI读取xls和xlsx
- sublime text ctags 不能正常跳转 can't find any relevent
- 主主+ lvs keepalived 配置文件
- C++设计模式-1简单工厂模式
- AFNetworking 3.0迁移指南
- java中Overload(重载)和Override(重写、覆盖)
- c语言入门之项目3.9——输出一个“空”三角形
- AJAXdemo.html
- bootstrapValidator不触发校验
- php empty和isset的比较
- MySQL主从复制结构中常用参数
- 排序——插入排序(insertionsort)
- 网络虚拟化是否需要额外的网络架构?
- Spring Mvc提交form表单上传文件