Search code examples
androidkotlinrotationbottomnavigationviewandroid-viewmodel

Why supportFragmentManager.saveFragmentInstanceState(selectedFragment)!! = null


I have done a BottomNavigationView with three button of A,B,C. After touch B or C then rotate screen will return to A. I have tried like below:

private fun bottomNavView() {
    bottom_nav_view.setOnNavigationItemSelectedListener {

        when (it.itemId) {
            R.id.navigation_home -> selectedFragment = HomeFragment.newInstance()

            R.id.navigation_add_photos -> selectedFragment = AddPhotosFragment.newInstance()


            R.id.navigation_profile -> selectedFragment = ProfileFragment.newInstance()
        }

        savedState =
            supportFragmentManager.saveFragmentInstanceState(selectedFragment)!!
        vm.setStateOfRotate(savedState)
        supportFragmentManager.beginTransaction()
            .replace(R.id.nav_host_fragment, selectedFragment)
            .commit()

        true
    }

Above will get error like below:

java.lang.IllegalStateException: Fragment AddPhotosFragment{e1f2f47 (8c74a7e8-3af7-4290-be4a-f16f8ea6229f)} is not currently in the FragmentManager

        at androidx.fragment.app.FragmentManagerImpl.saveFragmentInstanceState(FragmentManagerImpl.java:442)

        at com.squall.searchdesigner.MainActivity$bottomNavView$1.onNavigationItemSelected(MainActivity.kt:92)

92 line means↓

savedState = supportFragmentManager.saveFragmentInstanceState(selectedFragment)!!

=========================================================

private fun bottomNavView() {
    bottom_nav_view.setOnNavigationItemSelectedListener {

        when (it.itemId) {
            R.id.navigation_home -> selectedFragment = HomeFragment.newInstance()

            R.id.navigation_add_photos -> selectedFragment = AddPhotosFragment.newInstance()


            R.id.navigation_profile -> selectedFragment = ProfileFragment.newInstance()
        }


        vm.setStateOfRotate(savedState)
        supportFragmentManager.beginTransaction()
            .replace(R.id.nav_host_fragment, selectedFragment)
            .commit()
        savedState =
            supportFragmentManager.saveFragmentInstanceState(selectedFragment)!!
        true
    }
}

But if let: savedState = supportFragmentManager.saveFragmentInstanceState(selectedFragment)!!

put below of below line supportFragmentManager.beginTransaction().replace(R.id.nav_host_fragment, selectedFragment) .commit()

savedState become null.

savedState = null

What is the problem?


Solution

  • Later, I have solved the problem using companion object to store selectedFragment like below:

    companion object{
        var selectedFragment: Fragment? = null
    
    }