为什么 supportFragmentManager.saveFragmentInstanceState(selectedFragment)!! = 空
Why supportFragmentManager.saveFragmentInstanceState(selectedFragment)!! = null
我做了一个BottomNavigationView,有A、B、C三个按钮。触摸 B 或 C 后旋转屏幕将 return 到 A。
我试过如下:
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
}
上面会出现如下错误:
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.onNavigationItemSelected(MainActivity.kt:92)
92行表示↓
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
}
}
但如果让:
savedState = supportFragmentManager.saveFragmentInstanceState(selectedFragment)!!
放在下一行的下方
supportFragmentManager.beginTransaction().replace(R.id.nav_host_fragment, selectedFragment).commit()
savedState 变为空。
savedState = null
有什么问题?
后来,我解决了使用伴随对象存储 selectedFragment 的问题,如下所示:
companion object{
var selectedFragment: Fragment? = null
}
我做了一个BottomNavigationView,有A、B、C三个按钮。触摸 B 或 C 后旋转屏幕将 return 到 A。 我试过如下:
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
}
上面会出现如下错误:
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.onNavigationItemSelected(MainActivity.kt:92)
92行表示↓
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
}
}
但如果让: savedState = supportFragmentManager.saveFragmentInstanceState(selectedFragment)!!
放在下一行的下方 supportFragmentManager.beginTransaction().replace(R.id.nav_host_fragment, selectedFragment).commit()
savedState 变为空。
savedState = null
有什么问题?
后来,我解决了使用伴随对象存储 selectedFragment 的问题,如下所示:
companion object{
var selectedFragment: Fragment? = null
}