目前,我正在玩带有底部导航栏的 Android 导航组件。在玩的过程中,我意识到两个事实:
- 片段总是被重新创建(
onCreate
,onViewCreated
,onViewDestroyed
在用户导航到另一个片段时被调用) savedInstanceState
始终为空(在onCreate
、onViewCreated
等中)
第一个问题可以通过使用 custom 来解决FragmentNavigator
,如果它已经存在,它将重用片段
package am.chamich.apps.advancedbottomnavigation.navigator
import android.content.Context
import android.os.Bundle
import androidx.navigation.NavDestination
import androidx.navigation.NavOptions
import androidx.navigation.Navigator
import androidx.navigation.fragment.FragmentNavigator
@Navigator.Name("retain_state_fragment")
class RetainStateFragmentNavigator(
private val context: Context,
private val manager: androidx.fragment.app.FragmentManager,
private val containerId: Int
) : FragmentNavigator(context, manager, containerId) {
override fun navigate(
destination: Destination,
args: Bundle?,
navOptions: NavOptions?,
navigatorExtras: Navigator.Extras?
): NavDestination? {
val tag = destination.id.toString()
val transaction = manager.beginTransaction()
val currentFragment = manager.primaryNavigationFragment
if (currentFragment != null) {
transaction.detach(currentFragment)
}
var fragment = manager.findFragmentByTag(tag)
if (fragment == null) {
val className = destination.className
fragment = instantiateFragment(context, manager, className, args)
transaction.add(containerId, fragment, tag)
} else {
transaction.attach(fragment)
}
transaction.setPrimaryNavigationFragment(fragment)
transaction.setReorderingAllowed(true)
transaction.commit()
return destination
}
}
问题
对于第二个问题,我不知道如何修复它,实际上,我什至不明白片段是如何恢复其状态的(例如当你旋转屏幕时),我绑用来fragment.setInitialSavedState(savedState)
保存和恢复片段状态,但这在这种情况下无济于事。
实际上我需要知道的是何时重新创建片段视图
这是我的 GitHub 项目的链接,欢迎任何帮助。