简体   繁体   中英

Managing fragments with bottom navigation bar

I face problem with changing fragment in my container. I have three navigation: Home , Special offers , Profile . In Home navigation it could be fragment1_1 or fragment2_2 depending on situation. My problem is getting showed fragment from my container. I try to get using findFragmentById , but when I in Profile navigation and try to go to Home my code do not hide() fragment from Pofile . I tried to see the logs and I see that it hides Home and shows Home . My code for navigation:

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
    }

So now I want to understand why it is acting so and how can I get shown fragment from FrameLayout container. For adding fragments for my navigation I used addFragment() function.

you can try this one:

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

You can try this. Working fine for me tested.

Call this bellow method whenever want to add and show previous existing fragment

 /**
 * 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()
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM