Android 解决Jetpack Navigation组件返回上一个Fragment时重走onCreateView、onViewCreated方法问题
2020-06-26 04:21
4147 查看
使用navigate()方法跳转其他Fragment,再navigateUp()该Fragment出栈并返回上一个界面时,会重走上一个界面的onCreateView和onViewCreated()生命周期方法,导致View和数据的初始化代码逻辑会重新执行,每次返回都会刷新页面。并且如果上一页面中初始化逻辑较多,可能会导致返回时有明显卡顿。
问题场景:在项目中fragmentA界面的数据初始化操作是放在懒加载方法中执行,再跳转fragmentB界面并返回时,Afragment界面onViewCreated会重新执行View会重新初始化,但数据初始化只在懒加载方法中执行一次,这时上一fragment界面就会出现空白的情况。同时我在官方给出的Sunflower Demo中也验证了,同样是返回时上一fragment页面会重走。
问题原因:Navigation组跳转另一Fragment时,navigate()方法源码中使用的是ft.replace()方式,并不是add() hide() show(),这也导致了fragmentB覆盖fragmentA,返回时fragmentA是重新Create的。
[code]public NavDestination navigate(@NonNull Destination destination, @Nullable Bundle args, @Nullable NavOptions navOptions, @Nullable Navigator.Extras navigatorExtras) { // ...省略 ft.replace(mContainerId, frag); ft.setPrimaryNavigationFragment(frag); // ...省略 }
解决方法:将NavHostFragment、FragmentNavigator类拷贝到项目中,修改FragmentNavigator中的navitgate()方法,并修改NavHostFragment中import FragmentNavigator的路径。
[code]public NavDestination navigate(@NonNull Destination destination, @Nullable Bundle args, @Nullable NavOptions navOptions, @Nullable Navigator.Extras navigatorExtras) { // ...省略 if(mFragmentManager.getFragments().size()>0){ ft.hide(mFragmentManager.getFragments().get(mFragmentManager.getFragments().size()-1)); ft.add(mContainerId, frag); }else { ft.replace(mContainerId, frag); } // ft.replace(mContainerId, frag); ft.setPrimaryNavigationFragment(frag); // ...省略 }
同时在设置NavHost时与使用NavHostFragment.findNavController(this).navigate(actionId, args)方法跳转时,导包使用项目中的NavHostFragment。
相关文章推荐
- 【ANDROID】Android 在oncreate() 方法中调用 findViewById 返回 null 问题的原因和解决方法
- Android fragment 重叠问题的解决方法
- Android在fragment中调用getacvitity()返回null的解决方法
- Android中Fragment多层嵌套时onActivityResult无法正确回调问题的解决方法
- Android fragment 重叠问题——通过hide,show方式导致的解决方法
- Android fragment 重叠问题的解决方法
- vue-router 多个路由地址绑定一个组件造成 created 不执行的解决方法
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- 【Android问题】Android导入一个工程时提示 Invalid project description的解决方法
- 【Android问题】Android导入一个工程时提示 Invalid project description的解决方法
- Android fragment 重叠问题的解决方法
- Android中Fragment管理及重叠问题的解决方法
- Android-Jetpack笔记-Navigation之Fragment支持复用
- 解决WebService[WebMethod]方法返回一个SqlDataReader出错问题
- 解决Android中Fragment调用startactivityforresult不能返回结果的问题
- 关于Android DES加密算法在不同平台加密结果不同的问题的一个解决方法
- Android fragment 重叠问题的解决方法
- android上webview的一个问题解决方法
- android中多个fragment切换时如何避免重复执行onCreateView方法,如何保存上一个fragment的状态
- Android解决Fragment使用replace方法重叠问题