Navigation问题详解——Fragment建立新的实例

背景

周末,有位同窗在微信公共号后台,给我留言,说看了我以前写两篇文章,谷歌官方组件Navigation你了解了吗?谷歌官方组件Navigation你会用了吗?以后,也在尝试使用Navigation,可是使用的过程中遇到了问题:
每次进入下一个Fragment无论任务栈里是否存在该Fragment的实例,都会建立一个新的实例而不会复用。
为了说明问题,我录了一个GIF android

这样就会出现一个问题,可能咱们以前的OneFragment保存一些状态或者数据,当咱们跳转OneFragment的时候,由于建立新的实例致使咱们以前保存状态或者数据所有消失。bash

popUpTo/popUpToInclusive

在action当中设置两个属性微信

app:popUpTo="@id/oneFragment"
   app:popUpToInclusive="true"
复制代码

咱们能够实现以下的效果: app

注意若是要实现以上效果咱们应该注意一下几个地方:
1.若是咱们用Kotlin语言,那么咱们在gradle当中引用的地方的类库,须要改为post

implementation "android.arch.navigation:navigation-fragment-ktx:$nav_version" // use -ktx for Kotlin
 implementation "android.arch.navigation:navigation-ui-ktx:$nav_version" // use -ktx for Kotlin
复制代码

2.这样咱们在Fragment当中调用的方法为:gradle

findNavController().navigate(R.id.action_oneFragment_to_twoFragment)
复制代码

注意这里,引用的findNavController包为:动画

import androidx.navigation.fragment.findNavController
复制代码

3.resource id替换为action id 看过我以前代码的同窗,可能会注意到我特地强调ui

findNavController().navigate(R.id.action_oneFragment_to_twoFragment)
复制代码

这里的id最好用action id,这一种能够配合着action里的动画使用,固然也能够配合着action里的属性popUpTo popUpToInclusive来使用。
以前有位同窗在公共号给我留言,问下了Demo以后,为何设置 popUpTo/popUpToInclusive不起做用,问题就在这里应该是action Id
代码我已经更新,欢迎star和下载。若有问题欢迎给我留言!spa

问题依旧....

看似,咱们在回退的时候,正常了。可是,咱们的问题依旧存在,每次点击的时候依然会建立一个新的Fragment,一个新的实例,只是咱们在建立新的实例的时候,把以前的给清除了而已。 我会在下一篇文章介绍如何解决这个问题!3d

欢迎关注公共号

关注公共号会有更多收获!

相关文章
相关标签/搜索