onSaveInstanceState 在 onDestroyView 之后调用

Oli*_*123 5 android android-fragments kotlin-android-extensions onsaveinstancestate

我在这里处理奇怪的片段生命周期行为。

我有一个托管两个片段的活动:CityFragment - 显示城市列表和 WeatherFragment - 显示所选城市的天气预报。

当应用程序启动时,CityFragment 将显示在屏幕上,当用户选择城市时 - WeatherFragment 通过 supportFragmentManager 和 backstack 添加。然后,如果用户想要旋转屏幕,我会得到图片上的情况在此输入图像描述

  • 0-2 -- CitiesFragment 启动
  • 3-7 -- 用户选择城市,WeatherFragment 显示在屏幕上
  • 8-18 -- 屏幕旋转

正如您在日志中看到的,用户选择城市后,CitiesFragment 会调用 onStop 和 onDestroyView,之后的片段视图为 null。但是当屏幕旋转时,CitiesFragment onSaveInstanceState 会被调用(当视图已经被销毁时)。

这里的问题是,将代码转换为 kotlin 并使用合成进行视图访问后,当我想保存 recyclerview 第一个可见元素以在之后恢复时,我在 onSaveInstanceState 中收到 NullPointerException

val firstVisiblePosition = (recycler_view_cities.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
Run Code Online (Sandbox Code Playgroud)

使用旧的 java 实现,它工作得很好,因为我将 recycler_view_cities 的引用存储在片段中,并且可以在那里访问它。

  • 问题 1. CitiesFragment 的 onSaveInstance 状态不应该在 onStop 和 onDestroyView 之前调用吗?
  • 问题2.遇到这种情况如何处理?

ver*_*as1 5

CitiesFragment 的 onSaveInstanceState 不应该在 onStop 和 onDestroyView 之前调用吗?

不必要。来自片段文档onSaveInstanceState()

这对应于 {@link Activity#onSaveInstanceState(Bundle) Activity.onSaveInstanceState(Bundle)},其中的大部分讨论也适用于此处。但请注意:此方法可以在 onDestroy() 之前的任何时间调用。在很多情况下,片段可能大部分被拆除(例如当放置在返回堆栈上且没有 UI 显示时),但直到其所属的 Activity 实际上需要保存其状态时,才会保存其状态。

onSaveInstanceState()当活动关闭时将被活动调用(除非用户明确关闭它)。您的片段会收到回调,但可以处于 之前的任何状态onDestroy,这意味着 UI 可能已经被拆除。

遇到这种情况怎么处理?

检查 UI 是否存在于onSaveInstanceState()

if (fragment.getView() != null) {
   // Your stuff
}
Run Code Online (Sandbox Code Playgroud)