• 第 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

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

  • 相关阅读:
    浏览器版本过低
    虚拟PWN初探
    elasticsearch常用查询
    python安装pip模块
    spark-kafka-es交互 优化
    scala写文件
    python unittest
    scala collection(集合)
    spark-kafka-es交互
    scala语法
  • 原文地址:https://www.cnblogs.com/jlxuqiang/p/4758488.html
Copyright © 2020-2023  润新知