kotlin android导航图返回导致重新创建旧片段

kotlin android导航图返回导致重新创建旧片段,android,kotlin,Android,Kotlin,当我从片段B回到片段A时,我的项目中有一个巨大的问题,就像这样: findNavController().navigateUp() 或 导致一个旧片段被重新创建,我不知道为什么 这是我的行动: <action android:id="@+id/action_fragmentA_to_fragmentB" app:destination="@id/fragmentB" /> val

当我从片段B回到片段A时,我的项目中有一个巨大的问题,就像这样:

findNavController().navigateUp()

导致一个旧片段被重新创建,我不知道为什么

这是我的行动:

<action
            android:id="@+id/action_fragmentA_to_fragmentB"
            app:destination="@id/fragmentB" />






 val action = ScanningFragmentDirections.action_fragmentA_to_fragmentB(
            scanningViewModel.containerLevel,
            container
        )
        NavHostFragment.findNavController(this).navigate(action)



override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
     binding =
        DataBindingUtil.inflate(inflater, R.layout.scanning_fragment, container, false)
    binding!!.viewmodel = scanningViewModel
    binding!!.lifecycleOwner = this
    return binding!!.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    init()
}

val action=扫描碎片方向。action_fragmentA_到_fragmentB(
scanningViewModel.containerLevel,
容器
)
NavHostFragment.findNavController(此).navigate(操作)
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看?{
装订=
数据绑定器充气(充气器,右布局,扫描碎片,容器,假)
绑定!!.viewmodel=scanningViewModel
绑定!!.lifecycleOwner=此
返回绑定!!.root
}
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
init()
}

当您调用
findNavController()时。在引擎盖系统下导航(…)
调用:

FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.replace(mContainerId, frag);

这意味着当你通过Backback返回给他时,你的碎片将被完全销毁并重新创建。

当你调用
findNavController()时。在引擎盖下导航(…)
系统调用:

FragmentTransaction ft = mFragmentManager.beginTransaction();
ft.replace(mContainerId, frag);

这意味着您的片段将被完全销毁,当您通过backbackback返回给他时,将再次重新创建。

当您从一个片段导航到另一个片段时,您的片段视图将被销毁(
onDestroyView
被调用)。当您导航回以前在视图中的片段时,将重新创建(
onCreateView
被调用)

在某些情况下,您可能不希望重新创建片段(不久前,我有一个带有
MapView
的片段,我不想再次添加所有不同的标记和多边形)。您可以尝试以下方法:

在片段类中创建字段以保存视图:

private lateinit var contentView:View
onCreateView
功能中,仅当变量尚未初始化时才对视图进行充气

覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看?{
如果(!::contentView.i初始化){
contentView=充气机。充气(R.layout.fragment\u home,container,false)
} 
返回contentView
}

当您从一个片段导航到另一个片段时,您的片段视图将被销毁(
onDestroyView
)。当您导航回以前在视图中的片段时,将重新创建(
onCreateView
被调用)

在某些情况下,您可能不希望重新创建片段(不久前,我有一个带有
MapView
的片段,我不想再次添加所有不同的标记和多边形)。您可以尝试以下方法:

在片段类中创建字段以保存视图:

private lateinit var contentView:View
onCreateView
功能中,仅当变量尚未初始化时才对视图进行充气

覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看?{
如果(!::contentView.i初始化){
contentView=充气机。充气(R.layout.fragment\u home,container,false)
} 
返回contentView
}


请发布您的“导航到”操作。你在用app:popUpTo吗?@NicolaGallazzi我把我的动作放在了看起来不错的地方,把你的代码放在你使用动作的地方_fragmentB@NicolaGallazzi我把代码放进去了,就像@ianhanniballake说的,你的片段保存在后台,但是你的视图被破坏了。在onViewCreated方法中,您应该具有重新创建UI的逻辑。你能发布你的碎片代码吗?请发布你的“导航到”操作。你在用app:popUpTo吗?@NicolaGallazzi我把我的动作放在了看起来不错的地方,把你的代码放在你使用动作的地方_fragmentB@NicolaGallazzi我把代码放进去了,就像@ianhanniballake说的,你的片段保存在后台,但是你的视图被破坏了。在onViewCreated方法中,您应该具有重新创建UI的逻辑。你能帮我把你的零碎代码贴出来吗?你百分之百确定吗?文档说明:“Android维护一个包含您访问过的目的地的后台堆栈。当用户打开应用程序时,应用程序的第一个目的地会放在堆栈上。每次调用navigate()方法都会将另一个目的地放在堆栈上。点击Up或back会调用NavController.navigateUp()和NavController.popBackStack()方法,以从堆栈中移除(或弹出)顶部目标。另一方面,片段的视图被破坏并重新创建。那么我要做什么呢?我不想重新创建我的旧碎片你应该保存并恢复碎片的ui状态你100%确定吗?文档说明:“Android维护一个包含您访问过的目的地的后台堆栈。当用户打开应用程序时,应用程序的第一个目的地会放在堆栈上。每次调用navigate()方法都会将另一个目的地放在堆栈上。点击Up或back会调用NavController.navigateUp()和NavController.popBackStack()方法,以从堆栈中移除(或弹出)顶部目标。另一方面,片段的视图被破坏并重新创建。那么我要做什么呢?我不想重新创建我的旧片段您应该保存并恢复片段的ui状态此答案适用于视图如何在视图模型上保留数据每次按back键时它都会呼叫您API@anwarsamir如果不看一下您的实现,就不可能说出发生了什么。你可能想发布一个关于你的问题的问题。这个答案对vi来说很好