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()