【问题标题】:Destroy instance of a Fragment/trigger onDestroy with Navigation library使用导航库销毁片段/触发器 onDestroy 的实例
【发布时间】:2020-01-19 00:00:15
【问题描述】:

我正在使用导航库,我的用例是在后按时保留片段状态,我通过在 onViewCreated 中返回已经膨胀的绑定来实现,因为当更改片段导航似乎不会破坏该片段的现有实例时,实际视图变量存在时你在那里导航回来或向上。

但是当我需要重新创建此 Fragment 实例时,我也有一个用例,因此我希望有一种方法可以为该 Fragment 调用 onDestroy()。但我没有看到任何用于删除/获取 backstack 实例中现有的 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" />

【问题讨论】:

    标签: android android-fragments navigation android-jetpack


    【解决方案1】:
    List<Fragment> fragments = getActivity().getSupportFragmentManager().getFragments();          
    Fragment lastFragment = fragments.get(fragments.size() - 1);
    getActivity().getSupportFragmentManager().beginTransaction().remove(emptyDialog);
    

    【讨论】:

    • 谢谢,但我正在使用来自喷气背包的导航库。如果您使用我不是的片段管理器,则此代码很好。仅供参考,这段代码有多个 npe 位置,也可能出现越界异常。
    • 我也在用导航,遇到了和你一样的问题。此代码有帮助
    • 您可以将片段管理器与导航一起使用,但我担心它可能会进入通过管理器访问图表的奇怪条件。但是谢谢
    【解决方案2】:

    自 2.1.0 以来导航库的变化

    NavBackStackEntry:您现在可以调用 NavController.getBackStackEntry(),传入返回堆栈上的目的地或导航图的 ID。除了提供用于启动该目的地的参数外,返回的 NavBackStackEntry 还提供导航驱动的 LifecycleOwner、ViewModelStoreOwner(与 NavController.getViewModelStoreOwner() 返回的相同)和 SavedStateRegistryOwner。

    所以计划是使用新的 api 来查看 NavBackStackEntry 可用的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多