[半分钟读完]Android中保存和恢复Fragment状态的最好方法
引言:受谷阿莫的《几分钟看完》系列视频的启发。我也准备写一些几分钟看完的文章,摘录博客的要点,也可以节省查阅的时间。
这是《几分钟读完》的第一篇,文章的原文是:Probably be the best way (?) to save/restore Android Fragment’s state so far。如标题,本文就讲了一个保存 Android 的 Fragment 的状态的方法。
我们都知道,类似 Activity,Fragment
有 onSaveInstanceState()
回调用来保存状态。但是,根据作者的经验,这个方法调用非常的不靠普。Fragment 在屏幕旋转和返回堆栈(Backstack)中的时候,都会创建一个全新的 View,这个 onSaveInstanceState()
方法经常会出现不会被调用的情况,导致 Fragment 的状态丢失。
解决办法:因为 Fragment 的参数(Arguments,是一个 Bundle
类型)是跟随 Fragment 被持久保存的,所以就可以在 onSaveInstanceState()
和 onDestroyView()
回调中把状态信息保存在 Arguments 的一个特殊的 Key 中,在 onActivityCreated()
回调中,从 Arguments 中恢复出状态数据。
另外注意:我(指原作者)为什么不使用 setRetainInstance(true)
,在配置变化(例如旋转屏幕)的时候保持 Fragment 对象。因为这种方法并不通用,例如你不能保持一个嵌套的 Fragment。
最后提供了一个开源项目 StatedFragment。