android - 如何不使用 androidX 销毁片段
问题描述
现在,我尝试了androidX的导航和底部导航栏,当我像下面这样使用它时
supportFragmentManager = getSupportFragmentManager();
navHostFragment =(NavHostFragment)supportFragmentManager.findFragmentById(R.id.frag_nav);
navController = navHostFragment.getNavController();
NavigationUI.setupWithNavController(navigation, navController);
发现一个问题,每次切换bottomNavigationBar,fragment会重新创建,目标fragment中的所有网络任务都会重做,androidX切换时如何保持fragment的状态?
解决方案
我也有同样的问题。我将 BottomNavigationView 与导航架构组件一起使用,并且每次都重新创建片段。如您在 Google 问题跟踪器 ( https://issuetracker.google.com/issues/109856764 )中所见,这是预期行为。
所以解决这个问题的正确方法是将当前视图状态保存在 ViewModel 中,并在每个新创建的片段中观察该状态。您需要在 ViewModel 中完成所有网络任务。
还要注意在片段中获取 ViewModel 的方式。如果你这样做viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
,ViewModel 将获得片段范围(片段被销毁时它将被销毁)。您必须获得具有活动范围的 ViewModel,以便它可以在片段之间的切换中幸存下来。你可以这样做viewModel = ViewModelProviders.of(activity!!, viewModelFactory).get(MyViewModel::class.java)
推荐阅读
- javascript - 复选框永远不会检查 - 即使值为 true
- jfrog - 无法登录到 jfrog 中的虚拟存储库
- python - 如何将由 json/dict 条目制成的数据框拆分为多个列以进行遍历?
- google-cloud-platform - 谷歌云存储桶的扩容授权
- wordpress - 单个 wordpress 安装 + IIS 反向代理 = 主页上的重定向太多
- node.js - Mineflayer 可以在携带版服务器上运行吗?
- reactjs - 通过道具后无法查看倒计时时间
- alert - 根据图纸创建警报?
- mule - 在 mule 的安全属性中接受的特殊字符
- json - 我无法从 Parse 获取 sessionToken