Я хочу перейти от FragmentA (RootFragment) к FragmentB, но не хочу воссоздавать представление FragmentA, как только оно возвращается из FragmentB.
Я использую Jetpack Navigation для навигации между фрагментами.
Для достижения вышеуказанной цели у меня есть фрагмент 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()
}
}
Но FragmentA (RootFragment) протекает, когда я достигаю Fragment B с атрибутом viewToRestore.
Любое решение, которое может работать без утечек, но достичь той же цели?
Утечка является ложным срабатыванием. С точки зрения фрагмента вполне нормально удерживать представление, которое вы создаете в onCreateView
и возвращать его позже, при условии, что ваш фрагмент не сохраняется или иным образом сохраняется дольше, чем контекст, использованный для создания представления, жив.
Проблема, которая у вас есть, является проблемой для навигации 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
, поэтому я рекомендую не использовать навигацию, когда важно не воссоздавать первый фрагмент