android_jetpack_navigation返回fragment重走onCreateView方法,导致fragment状态没保存/重新初始化

16 篇文章 0 订阅
15 篇文章 0 订阅

解决Android jetpack导航组件Navigation返回Fragment重走onCreateView方法刷新视图的问题

在使用Navigation的过程中,发现其页面跳转效率确实很不错,XML管理页面跳转逻辑以及fragment之间的参数传递使用起来都很方便,但是一个很大的问题就是在fragment出栈返回上一页时,上一个fragment会重走onCreateView方法。而我们的很多view和数据初始化工作都是在onViewCreated之后进行的,这导致之前的初始化数据全无,需要重新初始化过,导致的结果是每次回上一个页面可能会重新刷新,这一点体验很差。这里提供一个方法来避免每次重新创建view。

编写一个BaseNavigationFragment:

    class BaseNavigationFragment : BaseFragment() {
        protected var isNavigationViewInit = false//记录是否已经初始化过一次视图
        private var lastView: View? = null//记录上次创建的view
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            //如果fragment的view已经创建则不再重新创建
            if (lastView == null) {
                lastView = super.onCreateView(inflater, container, savedInstanceState)
            }
            return lastView
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            if(!isNavigationViewInit){//初始化过视图则不再进行view和data初始化
                super.onViewCreated(view, savedInstanceState)
                initView(view)
                initData()
                isNavigationViewInit = true
            }
        }
    }

参考:

在这里插入图片描述

核心思路在上面的注释,即保存上次创建的view,返回上一页再次走onCreateView时直接将其返回,并且在onViewCreated方法中不再进行初始化工作。
leak canary可能会提示lastView内存泄漏,忽略即可。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值