[半分钟读完]Android中保存和恢复Fragment状态的最好方法

引言:受谷阿莫的《几分钟看完》系列视频的启发。我也准备写一些几分钟看完的文章,摘录博客的要点,也可以节省查阅的时间。

这是《几分钟读完》的第一篇,文章的原文是:Probably be the best way (?) to save/restore Android Fragment’s state so far。如标题,本文就讲了一个保存 Android 的 Fragment 的状态的方法。

我们都知道,类似 Activity,FragmentonSaveInstanceState() 回调用来保存状态。但是,根据作者的经验,这个方法调用非常的不靠普。Fragment 在屏幕旋转和返回堆栈(Backstack)中的时候,都会创建一个全新的 View,这个 onSaveInstanceState() 方法经常会出现不会被调用的情况,导致 Fragment 的状态丢失。

解决办法:因为 Fragment 的参数(Arguments,是一个 Bundle 类型)是跟随 Fragment 被持久保存的,所以就可以在 onSaveInstanceState()onDestroyView() 回调中把状态信息保存在 Arguments 的一个特殊的 Key 中,在 onActivityCreated() 回调中,从 Arguments 中恢复出状态数据。

另外注意:我(指原作者)为什么不使用 setRetainInstance(true),在配置变化(例如旋转屏幕)的时候保持 Fragment 对象。因为这种方法并不通用,例如你不能保持一个嵌套的 Fragment。

最后提供了一个开源项目 StatedFragment