为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Android Kotlin

背景

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

这样就会出现一个问题,可能我们之前的 OneFragment 保存一些状态或者数据,当我们跳转OneFragment的时候,因为创建新的实例导致我们之前保存状态或者数据全部消失。

popUpTo/popUpToInclusive

在action当中设置两个属性

   app:popUpTo="@id/oneFragment"
   app:popUpToInclusive="true"

我们可以实现如下的效果:

注意如果要实现以上效果我们应该注意一下几个地方:
1.如果我们用 Kotlin 语言,那么我们在 gradle 当中引用的地方的类库,需要改成

  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当中调用的方法为:

        findNavController().navigate(R.id.action_oneFragment_to_twoFragment)

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

import androidx.navigation.fragment.findNavController

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

 findNavController().navigate(R.id.action_oneFragment_to_twoFragment)

这里的id最好用action id,这一种可以配合着action里的动画使用,当然也可以配合着action里的属性popUpTo popUpToInclusive来使用。
之前有位同学在公共号给我留言,问下了 Demo 之后,为什么设置 popUpTo/popUpToInclusive不起作用,问题就在这里应该是action Id
代码我已经更新,欢迎star和下载。如有问题欢迎给我公共号「朝阳杨大爷」留言!
我会第一时间回复!
https://github.com/yang0range/NavigationComponent

问题依旧…

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

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消