在onDestroyView

时间:2018-05-14 09:00:54

标签: android android-fragments kotlin-android-extensions onsaveinstancestate

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

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

当应用程序启动时,屏幕上会显示CityFragment,当用户选择城市时 - 通过带有Backstack的supportFragmentManager添加WeatherFragment。 然后,如果用户想要旋转屏幕,我就会看到图片enter image description here

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

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

这里的问题是,在将代码转换为kotlin并使用synthetic进行视图访问之后,我想在onSaveInstanceState中获取NullPointerException,当我想保存recyclelerview第一个可见元素后再恢复

val firstVisiblePosition = (recycler_view_cities.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()

使用旧的java实现,它工作正常,因为我将片段中的recycleler_view_cities的引用存储起来,我可以在那里访问它。

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

1 个答案:

答案 0 :(得分:2)

  

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

不一定。来自onSaveInstanceState()的片段文档:

  

这对应于{@link Activity#onSaveInstanceState(Bundle)     Activity.onSaveInstanceState(Bundle)}和那里的大部分讨论     这里也适用。但请注意:可以调用此方法     在onDestroy()之前的任何时间。有很多情况     片段可能大部分被拆除(例如放置在片段上)     带有无UI显示的后台堆栈,但其状态将不会保存到     它的拥有活动实际上需要保存其状态。

当活动关闭时,

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

  

如何处理这种情况?

检查onSaveInstanceState()中是否存在用户界面:

if (fragment.getView() != null) {
   // Your stuff
}