Android 使用底部导航栏管理片段
我面临更改容器中片段的问题。我有三个导航:Android 使用底部导航栏管理片段,android,android-fragments,Android,Android Fragments,我面临更改容器中片段的问题。我有三个导航:主页,特别优惠,个人资料。在主页导航中,可能是片段1\u 1或片段2\u 2,具体取决于具体情况。我的问题是从我的容器中取出碎片。我尝试使用findFragmentById获取,但当我在Profile导航中并尝试转到Home时,我的代码不hide()片段来自Pofile。我试图查看日志,发现它隐藏了Home并显示了Home。我的导航代码: botNav.setOnNavigationItemSelectedListener { when(
主页
,特别优惠
,个人资料
。在主页
导航中,可能是片段1\u 1
或片段2\u 2
,具体取决于具体情况。我的问题是从我的容器中取出碎片。我尝试使用findFragmentById
获取,但当我在Profile
导航中并尝试转到Home
时,我的代码不hide()
片段来自Pofile
。我试图查看日志,发现它隐藏了Home
并显示了Home
。我的导航代码:
botNav.setOnNavigationItemSelectedListener {
when(it.itemId){
R.id.act_home -> {
if (!it.isChecked){
val homeFragment = supportFragmentManager.findFragmentByTag("Home")
activeFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
activeFragment?.let { hideFragment(it) }
showFragment(homeFragment!!)
}
}
R.id.act_profile_info -> {
if (!it.isChecked) {
activeFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
activeFragment?.let { hideFragment(it) }
showFragment(profileFragment)
}
}
R.id.act_special_offer -> {
if (!it.isChecked) {
activeFragment = supportFragmentManager.findFragmentById(R.id.fragment_container)
activeFragment?.let { hideFragment(it) }
showFragment(specialFragment)
}
}
}
return@setOnNavigationItemSelectedListener true
}
现在我想了解它为什么会这样,以及如何从FrameLayout
容器中获得显示的片段。
为了为我的导航添加片段,我使用了addFragment()
函数。您可以尝试以下方法:
//Fragment1 is your new fragment to be shown.
Fragment fragment=new Fragment1();
if (fragment != null) {
FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
//frams is your backup fragment upon on your navigation/new black
fragment(thi will beshown if the Fragment1 is not working)
ft.replace(R.id.frams, fragment);
ft.commit();
你可以试试这个:
//Fragment1 is your new fragment to be shown.
Fragment fragment=new Fragment1();
if (fragment != null) {
FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
//frams is your backup fragment upon on your navigation/new black
fragment(thi will beshown if the Fragment1 is not working)
ft.replace(R.id.frams, fragment);
ft.commit();
你可以试试这个。对我来说工作很好 每当需要添加和显示以前的现有片段时,调用下面的方法
/**
* Method for add and replace and set fragment if exist in stack
*/
fun setAndReplaceFragment(fragmentWantToAdd: Fragment, tag: String) {
val manager = supportFragmentManager
val fragmentFind = manager.findFragmentByTag(tag)
if (fragmentFind != null) {
val ft = manager.beginTransaction()
ft.replace(R.id.mFrmContainer, fragmentFind, tag)
ft.addToBackStack(tag)
ft.commit()
} else {
val ft = manager.beginTransaction()
ft.replace(R.id.mFrmContainer, fragmentWantToAdd, tag)
ft.addToBackStack(tag)
ft.commit()
}
}
你可以试试这个。对我来说工作很好 每当需要添加和显示以前的现有片段时,调用下面的方法
/**
* Method for add and replace and set fragment if exist in stack
*/
fun setAndReplaceFragment(fragmentWantToAdd: Fragment, tag: String) {
val manager = supportFragmentManager
val fragmentFind = manager.findFragmentByTag(tag)
if (fragmentFind != null) {
val ft = manager.beginTransaction()
ft.replace(R.id.mFrmContainer, fragmentFind, tag)
ft.addToBackStack(tag)
ft.commit()
} else {
val ft = manager.beginTransaction()
ft.replace(R.id.mFrmContainer, fragmentWantToAdd, tag)
ft.addToBackStack(tag)
ft.commit()
}
}
添加你们现在得到的图片。添加你们现在得到的图片。在
show()
hide()
和replace()
函数之间有什么区别吗?顺便说一下,这样的代码每次都在创建片段的实例,我试图避免的是不创建每个片段的新实例,它只是将一个片段替换为另一个片段。我按照您的建议使用了replace()
方法,但您能否回答为什么我的代码的行为与我描述的一样?如果您想知道为什么您的代码不能正常工作,那么我需要您的两种方法代码,这两种方法代码都很重要。showFragment()hideFragment()函数在show()
hide()
函数和replace()
函数之间有什么区别吗?顺便说一下,这样的代码每次都创建片段的实例,我试图避免的是不创建每个片段的新实例,它只是将一个片段替换为另一个片段。我按照您的建议使用了replace()
方法,但您能否回答为什么我的代码的行为与我描述的一样?如果您想知道为什么您的代码不能正常工作,那么我需要您的两种方法代码,这两种方法代码都很重要。showFragment()hideFragment()