private var savedViewInstance: View? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return if (savedViewInstance != null) {
savedViewInstance
} else {
savedViewInstance =
inflater.inflate(R.layout.fragment_professional_details, container, false)
savedViewInstance
你得到的行为是默认行为,片段将在你每次调用navigator.popBackStack()或使用设备上的返回按钮时重新创建它们的视图。
让我们来理解导航架构下的片段的生命周期。
情景。我们有两个片段,HomeFragment和DashboardFragment。这两个片段都属于同一个NavGraph,并且起始目标是Home Fragment。
启动应用程序时的片段生命周期
HomeFragment: onAttach:
HomeFragment: onCreate:
HomeFragment: onCreateView:
HomeFragment: onViewCreated:
HomeFragment: onActivityCreated:
HomeFragment: onStart:
HomeFragment: onResume:
On Navigation: Home Fragment ---> Dashboard Fragment
DashboardFragment: onAttach:
DashboardFragment: onCreate:
DashboardFragment: onCreateView:
DashboardFragment: onViewCreated:
DashboardFragment: onActivityCreated:
DashboardFragment: onStart:
DashboardFragment: onResume:
HomeFragment: onPause:
HomeFragment: onStop:
HomeFragment: onDestroyView:
On Navigation: Dashboard Fragment ---> Home Fragment
HomeFragment: onAttach:
HomeFragment: onCreate:
HomeFragment: onCreateView:
HomeFragment: onViewCreated:
HomeFragment: onActivityCreated:
HomeFragment: onStart:
HomeFragment: onResume:
DashboardFragment: onPause:
DashboardFragment: onStop:
HomeFragment: onDestroy:
DashboardFragment: onDestroyView:
DashboardFragment: onDestroy:
如果我们在最初的HomeFragment: onCreateView()上保存视图,并在下一次调用HomeFragment: onCreateView()时每次充气相同的视图,我们可以得到旧的视图。
如果你注意到HomeFragment: onDestroy()将被调用,但是在HomeFragment: onViewCreated()被调用之后。调用HomeFragment: onDestroy()只是破坏了HomeFragment的旧实例。
我仍然认为这种做事方式不是最好的做法,但它将是直到,谷歌将出现类似onFragemntRestore()的东西。
另一方面,碎片应该在每次被移除或替换时被重新创建,你应该使用onSaveInstanceState()来恢复它们的状态。
在这里,ViewModel可以省去保存片段状态和恢复它们的麻烦。
要实际更新视图,你必须需要ViewModel并观察视图中的变化。
简单地说,如果你有something,无论你在哪里,它都会为你的观点提供数据,如果你回到同一个位置,没有任何变化,那something就有你之前的样子的信息。这个something就是ViewModel。
关于同一主题,还有许多其他值得阅读的内容,如this, this和this
编码愉快 !