首页 > 解决方案 > kotlin android nav graph go back 导致重新创建旧片段

问题描述

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

findNavController().navigateUp()

或者

activity?.onBackPressed()

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

这是我的行动:

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

标签: androidkotlin

解决方案


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

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

在您的片段类中创建一个字段以保存您的视图:

private lateinit var contentView: View

onCreateView如果您的变量尚未初始化,则仅在函数中膨胀视图。

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    if (!::contentView.isInitialized) {
        contentView = inflater.inflate(R.layout.fragment_home, container, false)
    } 

    return contentView
}

推荐阅读