我在这里处理奇怪的片段生命周期行为。
我有一个托管两个片段的活动:CityFragment - 显示城市列表和WeatherFragment - 显示所选城市的天气预报。
当应用程序启动时,屏幕上会显示CityFragment,当用户选择城市时 - 通过带有Backstack的supportFragmentManager添加WeatherFragment。 然后,如果用户想要旋转屏幕,我就会看到图片
上的情况正如您在日志中看到的那样,在用户选择城市onStop之后,并且为CitiesFragment调用onDestroyView,此后片段视图为空。 但是当屏幕旋转时,将调用CitiesFragment onSaveInstanceState(当视图已被销毁时)。
这里的问题是,在将代码转换为kotlin并使用synthetic进行视图访问之后,我想在onSaveInstanceState中获取NullPointerException,当我想保存recyclelerview第一个可见元素后再恢复
val firstVisiblePosition = (recycler_view_cities.layoutManager as LinearLayoutManager).findFirstVisibleItemPosition()
使用旧的java实现,它工作正常,因为我将片段中的recycleler_view_cities的引用存储起来,我可以在那里访问它。
答案 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
}