Dboy233 / FragmentNavigatorHideShow

自定义Navigation FragmentNavigator 使用add hide 控制fragment,修改fragment状态onPause和onResume,提供Java和kotlin代码。
40 stars 6 forks source link

发现每次都会创建新的fragment实例,达不到复用的效果 #3

Closed 914375390 closed 1 year ago

914375390 commented 1 year ago

最后修改了FragmentNavigatorHideShow的隐藏显示片段,好像正常了 ` //region 添加的代码

    var frag: Fragment? = mFragmentManager.primaryNavigationFragment //查找当前导航栈顶的fragment,当前的flag
    if (frag != null) {//如果当前存在,就hide。
        ft.setMaxLifecycle(frag, Lifecycle.State.STARTED)
        ft.hide(frag)
    }
    //查找目标导航fragment 如果查找到了就show这个fragment,如果没有查找到就创建一个新的fragment。
    val tag = destination.id.toString()
  var  navfrag = mFragmentManager.findFragmentByTag(tag)//要导航的flag
    //如果当前fragment == 目的地fragment,同样创建  这里处理我打开我自己的逻辑,判断是否需要重新创建一个新的 frag。
    if (frag?.javaClass?.name == className) {
        ft.setMaxLifecycle(frag, Lifecycle.State.RESUMED)
        ft.show(frag)
    } else if (navfrag != null) {
        //fragment 已经存在显示
        ft.setMaxLifecycle(navfrag, Lifecycle.State.RESUMED)
        ft.show(navfrag)
    } else {
        //fragment 不存在创建,添加
        navfrag = mFragmentManager.fragmentFactory.instantiate(mContext.classLoader, className)
        navfrag.arguments = args//设置参数.
        ft.add(mContainerId, navfrag, tag)
    }
    //endregion

    //ft.replace(mContainerId, frag) //注释掉原有逻辑
    ft.setPrimaryNavigationFragment(navfrag)//将新的目标fragment标记为栈顶。可以这么理解。
    ft.setReorderingAllowed(true)
    return ft`
Dboy233 commented 1 year ago

image 这个地方我处理的是,fragment打开自己的操作。你这样改成show之后,可能会导致,无法打开同一个fragment。

Dboy233 commented 1 year ago

你看我demo的最后一个fragment , 比如说,当前VideoFragment是一个视频播放页面,,当前页面下面有其他推荐的视频。。当我点击推荐的视频,其fragment都是同一个VideoFragment。这时候就会导致当前正在播放的视频页面又被show了。没有打开新的视频播放页

Dboy233 commented 1 year ago

我自己看了一下。hide和show要处理的逻辑和状况非常的多。。而且复杂。。replace反而是最有效简单的方法。。我一直都不是很推荐使用hide和show来做业务.我又重新更改了判断。这次应该没问题了。。不过我没有处理

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

这个逻辑。需要如果你确实需要使用这个逻辑的话,需要在show之前进行判断。是否有popUpTo参数,如果有需要进行逻辑上的处理,移除popUpTo目标fragment之上所有fragment。 image