Dboy233 / FragmentNavigatorHideShow

自定义Navigation FragmentNavigator 使用add hide 控制fragment,修改fragment状态onPause和onResume,提供Java和kotlin代码。
40 stars 6 forks source link

Navigation 的版本为 2.4.0 时无效 #1

Closed lindroy closed 2 years ago

lindroy commented 2 years ago

Navigation 的版本更新为 2.4.0 后,HomeFragment 也会回调 onCreateView,页面还是会重绘。

Dboy233 commented 2 years ago

其实现在不推荐使用Hide来使用navigation,这是我的建议。 页面的数据保存推荐使用ViewModel+LiveData进行保存,LiveData会在页面onCreateView的时候, 通知observer,这个时候再执行一次数据展示。 一方面做好页面上耗时操作的暂停取消和恢复,二是减少fragment中临时变量的使用。 Hide show方式的好处是页面状态能及时展示给用户,但另一方面,如果页面层级比较多,会占用大量内存使用。

Dboy233 commented 2 years ago

这个问题,今天下班后我检查一下。

lindroy commented 2 years ago

其实现在不推荐使用Hide来使用navigation,这是我的建议。 页面的数据保存推荐使用ViewModel+LiveData进行保存,LiveData会在页面onCreateView的时候, 通知observer,这个时候再执行一次数据展示。 一方面做好页面上耗时操作的暂停取消和恢复,二是减少fragment中临时变量的使用。 Hide show方式的好处是页面状态能及时展示给用户,但另一方面,如果页面层级比较多,会占用大量内存使用。

推荐的做法确实是这样,不过返回时页面会闪烁一下,而且如果是列表的话滑动的位置会变化,看起来不太友好。

Dboy233 commented 2 years ago

其实现在不推荐使用Hide来使用navigation,这是我的建议。 页面的数据保存推荐使用ViewModel+LiveData进行保存,LiveData会在页面onCreateView的时候, 通知observer,这个时候再执行一次数据展示。 一方面做好页面上耗时操作的暂停取消和恢复,二是减少fragment中临时变量的使用。 Hide show方式的好处是页面状态能及时展示给用户,但另一方面,如果页面层级比较多,会占用大量内存使用。

推荐的做法确实是这样,不过返回时页面会闪烁一下,而且如果是列表的话滑动的位置会变化,看起来不太友好。

闪烁是有解决方案的。 image 等待UI的重建结束之后再进行,fragment的渲染/过场动画。 postponeEnterTransition()和startPostponedEnterTransition()两个fragment的supper方法结合使用。 列表滑动位置变化,这个需要你优化一下自己的RecylerVIew的Adapter了,RecylerView默认重建的时候会保存滚动位置,只要页面重建,item数据还是重建之前的,RecyclerView就没有问题,ScrollView同样也是可以保存滚动位置的。可以看我的那个NavigationDemo的示例程序。结合ViewModel和LiveData,页面重新进入的时候RV的位置是没有改变的。还有就是要做好数据刷新的判断。如果有数据页面数据不进行刷新。不要再onViewCreated中进行主动网络请求操作。将数据的改变和需要改变交给LiveData处理。

Dboy233 commented 2 years ago

Navigation 的版本更新为 2.4.0 后,HomeFragment 也会回调 onCreateView,页面还是会重绘。

已修复