В настоящее время я играю с компонентом навигации Android с нижней панелью навигации. Во время игры я осознал два факта:
- Фрагменты всегда воссоздаются (
onCreate
, onViewCreated
, onViewDestroyed
вызываются, как только пользователь переходит к другому фрагменту)
savedInstanceState
всегда равно нулю (в onCreate
, onViewCreated
и т. Д.)
Первая проблема может быть исправлена с помощью пользовательского FragmentNavigator
, который будет повторно использовать фрагмент, если он уже существует
package am.chamich.apps.advancedbottomnavigation.navigator
import android.content.Context
import android.os.Bundle
import androidx.navigation.NavDestination
import androidx.navigation.NavOptions
import androidx.navigation.Navigator
import androidx.navigation.fragment.FragmentNavigator
@Navigator.Name("retain_state_fragment")
class RetainStateFragmentNavigator(
private val context: Context,
private val manager: androidx.fragment.app.FragmentManager,
private val containerId: Int
) : FragmentNavigator(context, manager, containerId) {
override fun navigate(
destination: Destination,
args: Bundle?,
navOptions: NavOptions?,
navigatorExtras: Navigator.Extras?
): NavDestination? {
val tag = destination.id.toString()
val transaction = manager.beginTransaction()
val currentFragment = manager.primaryNavigationFragment
if (currentFragment != null) {
transaction.detach(currentFragment)
}
var fragment = manager.findFragmentByTag(tag)
if (fragment == null) {
val className = destination.className
fragment = instantiateFragment(context, manager, className, args)
transaction.add(containerId, fragment, tag)
} else {
transaction.attach(fragment)
}
transaction.setPrimaryNavigationFragment(fragment)
transaction.setReorderingAllowed(true)
transaction.commit()
return destination
}
}
Вопрос
Что касается второго вопроса, я понятия не имею, как это исправить, на самом деле, я даже не понял, как фрагмент восстанавливает свое состояние (например, при повороте экрана), я привязал к использованию fragment.setInitialSavedState(savedState)
, чтобы сохранить и восстановить состояние фрагмента, но это не поможет в этой ситуации.
На самом деле, мне нужно знать, когда фрагмент был воссоздан
Вот ссылка на мой проект GitHub, любая помощь приветствуется.