【问题标题】:NavController.popBackStack seems to create a new fragment instanceNavController.popBackStack 似乎创建了一个新的片段实例
【发布时间】:2019-09-27 09:45:26
【问题描述】:

我正在调用 NavController.popBackStack() 以返回到应用程序中的上一个片段。它实际上导航回来,但似乎创建了前一个片段的一个新实例,而不是重用前一个片段。让我更详细地解释发生了什么:

从 FragmentA 我通过在按钮的 onClick 方法中调用它来打开 FragmentB:

findNavController(FragmentA.this).navigate(R.id.fragment_b);

我还通过在执行此操作之前调用 button.setEnabled(false) 来禁用该按钮。

现在,FragmentB 已创建,一切正常。

然后我想回到之前的 FragmentA 实例,但是当我调用时

findNavController(FragmentB.this).popBackStack();

它返回到 FragmentA,但它在那里调用 onCreateView,因此我之前禁用的按钮再次启用,这不是预期的行为。

我尝试使用 navigateUp(),但结果是一样的。

有什么想法吗?

提前非常感谢!

【问题讨论】:

  • Fragment A 是否被视为顶级,即它是 BottomNavigationView 的一部分吗?
  • 你解决问题了吗?我遇到了同样的情况。
  • @Tony 不幸的是我没有,我只是采取了不同的方法。我建议您对这个问题进行投票,以便提高知名度,也许有人最终会回答,但我不会乐观,因为这在三个月内没有得到一个答案。
  • 你在哪里saving your fragment's state?似乎您还会因配置更改或进程死亡和重新创建而失去状态(即,您可以使用“不保留活动”开发人员选项模拟什么)。如果你处理了这些情况,那么当你从后台堆栈返回 Fragments 时,它们也会保存并恢复它们的状态。

标签: android android-fragments androidx


【解决方案1】:

当您通过findNavController().navigate() 导航到另一个片段时,片段事务管理器仍然是片段链(或片段堆栈)中片段的节点,但它也会删除前一个片段的视图层次结构。因此,当您导航回上一个屏幕时,内存中没有上一个片段的视图,这就是它再次重新创建视图(视图层次结构)的原因。

如果您在片段之间导航,您通常调用findNavController().navigate()

  1. findNavController().navigate() 调用FragmentNavigator.navigate()

  2. FragmentNavigator.navigate() 调用ft.replace(mContainerId, frag)

这是FragmentTransaction.replace()的文档:

替换已添加到容器中的现有片段。这本质上与为所有当前添加的片段调用 remove(Fragment) 相同,这些片段使用相同的 containerViewId 添加,然后使用此处给出的相同参数调用 add(int, Fragment, String)。

解决方案: 您可以将禁用状态保存在导航期间保留的某处,例如:ViewModel、Singleton 类。但我强烈推荐ViewModel。当您导航回片段并重新创建 View Hierarchy 后,您可以恢复按钮状态。

Fragment:onViewCreated() {
    viewModel.buttonState.observe(viewLifecycleOwner) { state->
        myButton.isEnabled = state.isEnabled
    }
}

ViewModel {
    val buttonState = MutableLiveData<ButtonState>()

    fun onSomeButtonClicked() {
        buttonState.value = ButtonState(false)
    }

    class ButtonState(
        val isEnabled: Boolean
    )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2021-12-23
    • 2013-06-13
    • 2020-11-28
    相关资源
    最近更新 更多