android - 使用导航库销毁片段/触发器 onDestroy 的实例
问题描述
我正在使用导航库,我的用例是在后按时保留片段状态,我通过在 onViewCreated 中返回已经膨胀的绑定来实现,因为当更改片段时导航似乎不会破坏该片段的现有实例,当您导航时实际视图变量存在向后或向上。
但是当我需要重新创建这个 Fragment 实例时,我也有一个用例,所以我希望有一种方法可以为那个 Fragment 调用 onDestroy()。但我没有看到任何用于删除/获取 backstack 实例中现有的 api。
所以我的问题是如何从 nav back stack 获取 Fragment 的现有实例并将其销毁,或者通过调用 nav controller api 将其删除。
一些代码:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel = ViewModelProviders.of(requireActivity(), mViewModelFactory)
.get(MainViewModel::class.java)
parseNavigationExtra()
return if (::mBinding.isInitialized) {
mBinding.root
} else {
//create new binding
}
所以当我调用这个动作时,我仍然得到旧的绑定根,因为变量仍然存在。
<action
android:id="@+id/clearBackStack"
app:destination="@+id/mainFragment"
app:launchSingleTop="true"
app:popUpTo="@+id/mobile_navigation"
app:popUpToInclusive="true" />
解决方案
自 2.1.0 以来导航库的变化
NavBackStackEntry:您现在可以调用 NavController.getBackStackEntry(),传入目的地的 ID 或返回堆栈上的导航图。除了提供用于启动该目的地的参数外,返回的 NavBackStackEntry 还提供导航驱动的 LifecycleOwner、ViewModelStoreOwner(与 NavController.getViewModelStoreOwner() 返回的相同)和 SavedStateRegistryOwner。
所以计划是使用新的 api 来查看 NavBackStackEntry 可用的内容。
推荐阅读
- java - 如何删除链表的一部分?
- azure-devops - 有没有办法在变量组中设置变量
- hadoop - 重启namenode或重启后datanode需要很长时间才能生效
- android - 当我点击常见问题或关于我们时,屏幕仍在设置片段上
- python - 我认为使用 train_test_split 对大型数据集进行采样,然后对样本使用 cross_validation 可能是错误的。同意?
- regex - 在 SAS 中使用 REGEX 匹配和删除重复出现的单词组
- r - 每次点击闪亮的动作按钮后,需要将航班名称附加到数据框
- python - 如何在 graphql-flask 中应用订阅?
- php - 如何在多对多关系中优化性能?
- java - 错误:编译小部件集时出现 NoClassDefFoundError