Jetpack Navigation 切换导致重新绘制

本文探讨了在使用Jetpack Navigation进行Fragment切换时遇到的刷新问题。原因是每次切换都创建了新的Fragment,而非简单刷新。文章分析了网上提供的解决方案,即自定义NavHostFragment和FragmentNavigator,但指出这种方法仍有不足。作者分享了自己修改源码的尝试,以避免重复创建Fragment,同时提供了联系方式以便进一步交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、现象

使用Navigation进行Fragment之间的跳转,这里使用底部Tab 效果切换的时候,Fragment每次都会刷新,这个效果肯定不是大家想要的,所以需要解决一下。

2、原因

问题原因:Navigation组跳转另一Fragment时,navigate()方法源码中使用的是ft.replace()方式
并且mFragmentManager.getFragments().size() 会变得越来越大。
基于此应该是每次都重新创建了 一个Fragment 而不只是刷新了页面。

既然是新的Fragment就不只是刷新的问题了。这里是通过全类名创建的,分析很可能是反射创建了Fragment

调用创建Fragment代码。通过源码跟踪确实是反射创建了新的Fragment
  public Fragment instantiate(@NonNull ClassLoader classLoader, @NonNull String className) {
        try {
            Class<? extends Fragment> cls = loadFragmentClass(classLoader, className);
            return cls.getConstructor().newInstance();
}

3、网上的解决方法

解决方法:将NavHostFragment、FragmentNavigator类拷贝到项目中,修改FragmentNavigator中的navitgate()方法,并修改NavHostFragment中import FragmentNavigator的路径。

public NavDestinati
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值