我正在使用导航库,我的用例是在后按时保留片段状态,这是我通过在 onView中创建的返回已经膨胀的绑定来实现的,因为更改片段时导航似乎不会破坏此片段的现有实例,当您向后或向上导航时,实际的视图变量存在。
但是当我需要重新创建这个片段实例时,我也有一个用例,所以我希望有一种方法可以为该片段调用 onDestroy((。但是我没有看到任何用于删除/获取反向堆栈实例中存在的 api。
所以我的问题是如何从导航后退堆栈获取片段的现有实例并销毁它,或者只是通过调用导航控制器 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" />
List<Fragment> fragments = getActivity().getSupportFragmentManager().getFragments();
Fragment lastFragment = fragments.get(fragments.size() - 1);
getActivity().getSupportFragmentManager().beginTransaction().remove(emptyDialog);
自2.1.0 以来导航库中的更改
NavBackStackEntry:您现在可以调用 NavController.getBackStackEntry((,在后退堆栈上传入目的地或导航图的 ID。返回的 NavBackStackEntry 除了提供用于启动该目标的参数外,还提供导航驱动的生命周期所有者、ViewModelStoreOwner(与 NavController.getViewModelStoreOwner(( 返回的相同(和 SavedStateRegistryOwner。
因此,计划是使用新的api来查看可用于NavBackStackEntry的内容。