我正在尝试在片段中显示材质底部导航。我的底部导航视图里面有三个片段。我解决了每次选择导航项时片段都会创建一个新实例的问题。但是当我从导航抽屉导航到另一个片段时,就会出现真正的问题。这是我的底部导航结构的样子。
Main Fragment(以下所有项都是Main Fragment内部的底部导航视图项)
家庭片段
通知片段
搜索片段
下面是我如何使用片段管理器添加、显示和删除片段。它是一个扩展功能。
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 导航到另一个片段并通过按返回按钮返回时,即使我尝试单击其他底部导航项目,当前显示的片段视图也会粘在屏幕上,它永远不会消失。
这是视频演示。
谢谢你的时间。