android - 打开新屏幕后返回屏幕时重新出现 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 意外重新显示。
尝试的解决方案
- 尝试将传递到 Intent 的上下文从 更改
context
为activity
。 context.startActivity(...)
从片段调用而不是startActivity(...)
- 为新的活动意图添加了一个标志:
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
根据这个答案。 - 将 YouTube 意图包装在“无头”片段(没有 UI 的片段)中,以尝试控制生命周期。
解决方案
解决方案
这与 YouTube API 无关,而是与 Android 架构库组件LiveData 相关。我正在使用LiveData变量来传递单击事件,当屏幕旋转时再次发出该事件。
Jose Alcérreca 在他的 Medium 帖子LiveData with SnackBar、Navigation 和其他事件(SingleLiveEvent 案例)中概述了最佳解决方案。
总之,Jose 创建了一个Event类来跟踪事件是否已被处理。这样,当屏幕旋转时,ViewModel和LiveData不会发出对单个事件不再有效的值。
推荐阅读
- javascript - 在 contentEditable 上使用元素需要两次单击才能进行第一次编辑
- javascript - 如果表是使用 Thymeleaf 制作的,如何使用 jquery 获取表的第一个单元格的内容
- javascript - 求模函数的周期性
- sql - Oracle 查询超时
- laravel-5 - Laravel 5:使用会话测试返回重定向
- go - Why is `math.Sin` disallowed in a Go constant?
- html - 使用背景图像时如何链接一些东西:url
- javascript - 容器、行、列 - 在 React-Bootstrap 中不起作用
- java - 短期项目:电子产品库存
- python - 用不同的单词替换文本文件中的单词(python)