Closed lindroy closed 2 years ago
其实现在不推荐使用Hide来使用navigation,这是我的建议。 页面的数据保存推荐使用ViewModel+LiveData进行保存,LiveData会在页面onCreateView的时候, 通知observer,这个时候再执行一次数据展示。 一方面做好页面上耗时操作的暂停取消和恢复,二是减少fragment中临时变量的使用。 Hide show方式的好处是页面状态能及时展示给用户,但另一方面,如果页面层级比较多,会占用大量内存使用。
这个问题,今天下班后我检查一下。
其实现在不推荐使用Hide来使用navigation,这是我的建议。 页面的数据保存推荐使用ViewModel+LiveData进行保存,LiveData会在页面onCreateView的时候, 通知observer,这个时候再执行一次数据展示。 一方面做好页面上耗时操作的暂停取消和恢复,二是减少fragment中临时变量的使用。 Hide show方式的好处是页面状态能及时展示给用户,但另一方面,如果页面层级比较多,会占用大量内存使用。
推荐的做法确实是这样,不过返回时页面会闪烁一下,而且如果是列表的话滑动的位置会变化,看起来不太友好。
其实现在不推荐使用Hide来使用navigation,这是我的建议。 页面的数据保存推荐使用ViewModel+LiveData进行保存,LiveData会在页面onCreateView的时候, 通知observer,这个时候再执行一次数据展示。 一方面做好页面上耗时操作的暂停取消和恢复,二是减少fragment中临时变量的使用。 Hide show方式的好处是页面状态能及时展示给用户,但另一方面,如果页面层级比较多,会占用大量内存使用。
推荐的做法确实是这样,不过返回时页面会闪烁一下,而且如果是列表的话滑动的位置会变化,看起来不太友好。
闪烁是有解决方案的。 等待UI的重建结束之后再进行,fragment的渲染/过场动画。 postponeEnterTransition()和startPostponedEnterTransition()两个fragment的supper方法结合使用。 列表滑动位置变化,这个需要你优化一下自己的RecylerVIew的Adapter了,RecylerView默认重建的时候会保存滚动位置,只要页面重建,item数据还是重建之前的,RecyclerView就没有问题,ScrollView同样也是可以保存滚动位置的。可以看我的那个NavigationDemo的示例程序。结合ViewModel和LiveData,页面重新进入的时候RV的位置是没有改变的。还有就是要做好数据刷新的判断。如果有数据页面数据不进行刷新。不要再onViewCreated中进行主动网络请求操作。将数据的改变和需要改变交给LiveData处理。
Navigation 的版本更新为 2.4.0 后,HomeFragment 也会回调 onCreateView,页面还是会重绘。
已修复
Navigation 的版本更新为 2.4.0 后,HomeFragment 也会回调 onCreateView,页面还是会重绘。