1

我正在尝试在片段中显示材质底部导航。我的底部导航视图里面有三个片段。我解决了每次选择导航项时片段都会创建一个新实例的问题。但是当我从导航抽屉导航到另一个片段时,就会出现真正的问题。这是我的底部导航结构的样子。

Main Fragment(以下所有项都是Main Fragment内部的底部导航视图项)

  1. 家庭片段

  2. 通知片段

  3. 搜索片段

    下面是我如何使用片段管理器添加、显示和删除片段。它是一个扩展功能。

fun FragmentManager.hideAndShowFragment(
    newFragment: Fragment, containerId: Int, hideFragmentInstance: Fragment? = null
) {
    beginTransaction().apply {
        if (hideFragmentInstance == null) {
            add(containerId, newFragment)
            commit()
            return
        }

        if (fragments.contains(hideFragmentInstance))
            hide(hideFragmentInstance)
        if (fragments.contains(newFragment))
            show(newFragment)
        else add(containerId, newFragment)
        commit()
    }
}

在上面的代码中,第一个条件是当没有片段显示并且不需要隐藏之前的片段时。然后如果FragmentManager List<Fragment>包含之前的片段首先隐藏,然后相应地显示新的片段。

这就是我调用这个扩展函数的方式。

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) : View {
      /////  other stuff
      bottomNav.setOnNavigationItemSelectedListener { menuItem ->
             val previousFragment = getCurrentShowingFragment(currentId)
             val newFragment = getNewFragment(menuItem.itemId)
             childFragmentManager.hideAndShowFragment(newFragment, CONTAINER_ID, previousFragment)
             currentId = menuItem.itemId
      }

      // First time 
      childFragmentManager.hideAndShowFragment(getNewFragment(currentId), CONTAINER_ID, null)
}

现在,当我尝试使用 Navigation Drawer 导航到另一个片段并通过按返回按钮返回时,即使我尝试单击其他底部导航项目,当前显示的片段视图也会粘在屏幕上,它永远不会消失。

这是视频演示

谢谢你的时间。

4

0 回答 0