我想从Fragment(Root Fragment)转到Fragment但是我不希望从FragmentB返回后重新创建FragmentA的视图。
我正在使用Jetpack Navigation在Fragments之间导航。
为了实现上述目标,我有一个像这样的片段Fragment:
class RootFragment : DaggerFragment() {
private var viewToRestore: View? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return if (viewToRestore != null) {
viewToRestore!!
} else {
return inflater.inflate(R.layout.fragment_root, parent, false)
}
}
override fun onDestroyView() {
viewToRestore = this.view
super.onDestroyView()
}
override fun onDestroy() {
super.onDestroy()
}
}
但是一旦我使用viewToRestore属性到达Fragment B,FragmentA(RootFragment)就会泄漏。
任何可以在没有泄漏的情况下工作但实现相同目标的解决方
泄漏是误报。从Fragment的角度来看,保持你在onCreateView
中创建的View并稍后返回它是完全没问题的,条件是你的Fragment没有保留或者保持的时间长于用于创建视图的Context。
您遇到的问题是Jetpack导航的问题,因为当您转到另一个可以替换的片段时无法添加:
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, FragmentB.newInstance())
.addToBackStack(null)
.commit()
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, FragmentB.newInstance())
.addToBackStack(null)
.commit()
这是差异replace
和add
。
我搜索了很多,我猜jetPack导航不支持add
而不是replace
,所以我建议不要使用导航,重要的是不要重新创建第一个片段