android - 导航而不创建 Fragment 的新实例 - 导航组件
问题描述
是否可以在navigate
不创建新片段实例但恢复前一个片段的情况下使用 Android 导航组件中的功能?
我试图恢复以前的片段但只有使用该 navigate
函数才能在片段之间传输数据。
解决方案
还没有,但我想他们正在努力。现在总是在创建新实例。但是,如果您编写自己的导航器,这是可能的。
@Navigator.Name("keep_state_fragment") // `keep_state_fragment` is used in navigation xml
class KeepStateNavigator(
private val context: Context,
private val manager: FragmentManager, // Should pass childFragmentManager.
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()
var initialNavigate = false
val currentFragment = manager.primaryNavigationFragment
if (currentFragment != null) {
transaction.detach(currentFragment)
} else {
initialNavigate = true
}
var fragment = manager.findFragmentByTag(tag)
if (fragment == null) {
val className = destination.className
fragment = manager.fragmentFactory.instantiate(context.classLoader, className)
transaction.add(containerId, fragment, tag)
} else {
transaction.attach(fragment)
}
transaction.setPrimaryNavigationFragment(fragment)
transaction.setReorderingAllowed(true)
transaction.commitNow()
return if (initialNavigate) {
destination
} else {
null
}
}
}
然后你必须像下面这样打电话
val navigator = KeepStateNavigator(this, navHostFragment.childFragmentManager, R.id.nav_host_fragment)
navController.navigatorProvider.addProvider(navigator)
这是示例:Github
推荐阅读
- java - java.lang.NoSuchMethodError: 'void org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor
- javascript - 未发送请求时将数据插入数据库
- django - 如何从覆盖范围中排除 django 库
- java - 在java中从一种类型转换为另一种类型的简单方法(当字段相似时)?
- amazon-web-services - 如何通过 N-1 次成功部署绕过 CodeDeploy
- flutter - 如何强制 Container 在 Flutter 中拥有其孩子的高度?
- express - TypeORM 和 Express 中间件
- firebase - E/StorageUtil(5389):获取令牌时出错 java.util.concurrent.ExecutionException:com.google.firebase.internal.api.FirebaseNoSignedInUserException
- java - 无法在 com.itextpdf:itext7-core:pom:RELEASE 收集依赖项
- python - 为什么在我点击按钮之前会出现测试标签?