我使用了fragmentManager.beginTransaction(),但隐藏函数不起作用



当底部导航切换时,我希望标题片段的屏幕不会消失。但我写。标题片段的循环查看数据将与两个片段和三个片段重叠。但是为什么当我有隐藏的时候它仍然显示??

这个主要活动

class MainActivity : AppCompatActivity() {
private val titleFragment = TitleFragment()
private val twoFragment = TwoFragment()
private val threeFragment = ThreeFragment()
private val fragmentManager = supportFragmentManager
private var activeFragment: Fragment = titleFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fragmentManager.beginTransaction().apply {
add(R.id.tragmentContainerView, threeFragment, "user").hide(threeFragment)
add(R.id.tragmentContainerView, twoFragment, "after").hide(twoFragment)
add(R.id.tragmentContainerView, titleFragment, "mind")
}.commit()
initListeners()

val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavigationView)


val navHostFragment = supportFragmentManager.findFragmentById(R.id.tragmentContainerView) as NavHostFragment?
if (navHostFragment != null) {
val controller = navHostFragment.navController
NavigationUI.setupActionBarWithNavController(this, controller)

controller.addOnDestinationChangedListener { _, destination, _ ->
if(destination.id == R.id.titleFragment ||destination.id == R.id.twoFragment||destination.id == R.id.threeFragment) {
bottomNavigationView.visibility = View.VISIBLE
} else {
bottomNavigationView.visibility = View.GONE
}
}
}
}
private fun initListeners() {
bottomNavigationView.setOnItemSelectedListener { menuItem ->
when (menuItem.itemId) {
R.id.titleFragment -> {
fragmentManager.beginTransaction().hide(activeFragment).show(titleFragment).commit()
activeFragment = titleFragment
true
}
R.id.twoFragment -> {
fragmentManager.beginTransaction().hide(activeFragment).show(twoFragment).commit()
activeFragment = twoFragment
true
}
R.id.threeFragment -> {
fragmentManager.beginTransaction().hide(activeFragment).show(threeFragment).commit()
activeFragment = threeFragment
true
}

else -> false
}
}
}
override fun onSupportNavigateUp(): Boolean {
return super.onSupportNavigateUp()||findNavController(R.id.tragmentContainerView).navigateUp()
}

}

如果短缺,请告诉我

这不是碎片的工作方式,当您将碎片添加到碎片管理器时,碎片的对象会存储在碎片管理器的后台。对于多个片段,它们不会同时渲染,因此只能显示和隐藏。因此,显示和隐藏不起作用。只有一个片段会在片段容器中呈现,该容器位于片段背景的顶部。

因此,您可以在setContentView 之后将第一个片段添加到后台

setContentView(R.layout.activity_main)
fragmentManager().beginTransaction().add(R.id.tragmentContainerView, titleFragment,"user")
.commit();

然后只需简单地替换背面的顶部碎片,

fragmentManager().beginTransaction().replace(R.id.tragmentContainerView, twoFragment,"after")
.commit();

但是,您可以使用第一条语句继续向backpack添加片段,然后可以使用此命令从backpack顶部删除片段。

fragmentManager().popBackStack();

因此,你的功能将像这个

private fun initListeners() {
bottomNavigationView.setOnItemSelectedListener { menuItem ->
when (menuItem.itemId) {
R.id.titleFragment -> {
fragmentManager.beginTransaction().replace("R.id.tragmentContainerView",titleFragment,"user").commit()
true
}
R.id.twoFragment -> {
fragmentManager.beginTransaction().replace("R.id.tragmentContainerView",twoFragment,"after").commit()
true
}
R.id.threeFragment -> {
fragmentManager.beginTransaction().replace("R.id.tragmentContainerView",threeFragment,"mind").commit()
true
}
else -> false
}
}

最新更新