Oli*_*123 5 android android-fragments kotlin-android-extensions onsaveinstancestate
我在这里处理奇怪的片段生命周期行为。
我有一个托管两个片段的活动:CityFragment - 显示城市列表和 WeatherFragment - 显示所选城市的天气预报。
当应用程序启动时,CityFragment 将显示在屏幕上,当用户选择城市时 - WeatherFragment 通过 supportFragmentManager 和 backstack 添加。然后,如果用户想要旋转屏幕,我会得到图片上的情况
正如您在日志中看到的,用户选择城市后,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 的引用存储在片段中,并且可以在那里访问它。
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)
| 归档时间: |
|
| 查看次数: |
1971 次 |
| 最近记录: |