第 14 章 fragment 的保留

请参考教材,全面理解和完成本章节内容... ...

复制工程ch13,将工程目录改名为ch14。

当前,HelloMoon应用对设备旋转的处理还不够完善。运行HelloMoon应用,播放音频,然后旋转设备。音频播放会嘎然而止。

设备旋转后,HelloMoonActivity随即被销毁。与此同时,负责销毁HelloMoonFragment的FragmentManager立即逐一调用fragment的生命周期方法,即onPause()、onStop()和OnDestroy()方法。我们知道,HelloMoonFragment.onDestroy()方法被调用后,MediaPlayer实例即被释放,结果导致了音频播放的停止。

在本书的第3章,我们通过覆盖Activity.onSaveInstanceState(Bundle)方法,修复了GeoQuiz应用的设备旋转相关问题。设备旋转后,新产生的activity读取保存的数据,然后恢复到旋转前的状态。Fragment具有相同功能的onSaveInstanceState(Bundle)方法。然而,就算保存了MediaPlayer对象的状态并在随后恢复,音频播放仍会中断。这显然会惹恼用户。

14.1 保留 fragment 实例

幸运的是,为应对设备配置的变化,可使用fragment的一个特殊方法来确保MediaPlayer实例一直存在。覆盖HelloMoonFragment.onCreate()方法并设置fragment的属性值,如代码清单14-1所示。

代码清单14-1 调用setRetainInstance(true)方法(HelloMoonFragment.java)

image

fragment的retainInstance属性值默认为false。这表明其不会被保留。因此,设备旋转时fragment会随托管activity一起销毁并重建。调用setRetainInstance(true)方法可保留fragment。已保留的fragment不会随activity一起被销毁。相反,它会被一直保留并在需要时原封不动的传递给新的activity。

对于已保留的fragment实例,其全部实例变量(如mPlayButton、MPlayer和mStopButton)值也将保持不变,因此可放心继续使用。

运行HelloMoon应用。播放音频,然后旋转设备,可看到音频的播放丝毫未受影响。

14.2 设备旋转与保留的 fragment

请参考教材,全面理解和完成后续内容... ...

原文地址:https://www.cnblogs.com/jlxuqiang/p/4758488.html