首页 > 解决方案 > 打开新屏幕后返回屏幕时重新出现 LiveData 值

问题描述

问题

当用户单击应用程序的 RecyclerView 单元格中的项目时,我已经从 Fragment 实现了 YouTube 意图。点击事件通过数据绑定在 xml 中处理并传递给绑定的ViewModel,后者将表示点击事件的LiveData值传递给Fragment

startActivity(YouTubeIntents.createPlayVideoIntentWithOptions(activity, content.id, false, false))    

但是,在触发onBackPressed()关闭从 YouTube 启动的 Activity 并返回到原始应用屏幕后,当屏幕旋转时,YouTube Activity 会重新出现,就好像 YouTube Activity 的finish()方法没有被调用一样。

预期的

关闭 YouTubeActivity 后旋转屏幕不会触发 YouTubeActivity 意外重新显示。

尝试的解决方案

  1. 尝试将传递到 Intent 的上下文从 更改contextactivity
  2. context.startActivity(...)从片段调用而不是startActivity(...)
  3. 为新的活动意图添加了一个标志:intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)根据这个答案
  4. 将 YouTube 意图包装在“无头”片段(没有 UI 的片段)中,以尝试控制生命周期。

标签: androidandroid-livedata

解决方案


解决方案

这与 YouTube API 无关,而是与 Android 架构库组件LiveData 相关。我正在使用LiveData变量来传递单击事件,当屏幕旋转时再次发出该事件。

Jose Alcérreca 在他的 Medium 帖子LiveData with SnackBar、Navigation 和其他事件(SingleLiveEvent 案例)中概述了最佳解决方案。

总之,Jose 创建了一个Event类来跟踪事件是否已被处理。这样,当屏幕旋转时,ViewModelLiveData不会发出对单个事件不再有效的值。


推荐阅读