android - NavController.popBackStack 似乎创建了一个新的 fragment 实例

标签 android android-fragments androidx

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

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

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

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

现在,FragmentB 已创建,一切都按预期进行。

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

findNavController(FragmentB.this).popBackStack();

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

我尝试使用navigateUp()代替,但结果是相同的。

有什么想法吗?

提前非常感谢!

最佳答案

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

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

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

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

这里是 FragmentTransaction.replace() 的文档:

Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.

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

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
    )
}

关于android - NavController.popBackStack 似乎创建了一个新的 fragment 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58132005/

相关文章:

android - 在 galaxy s2 上翻译后布局闪烁

android - OSM map 中的瓦片服务器是什么

android - 如何解析 KSOAP 中的字符串数组,android

android - 使按钮的背景颜色发生变化并在单击后保持不变

android - 使用 FragmentTabHost 在 fragment 之间切换动画

java - 在AndroidX中弃用setUserVisibleHint时加载数据

Android Jetpack Navigation 在 Fragment 之间传递 Lambda/Delegate

Java Android : how to increment a chronometer by 2 seconds after you clicked a button?

java - fragment 替换不起作用

java - 添加 androidx.room :room-compiler:2. 1.0-alpha05 后项目未编译