Фрагмент saveInstanceState всегда равен нулю при использовании компонента навигации - PullRequest
3 голосов
/ 22 апреля 2019

В настоящее время я играю с компонентом навигации 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, любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Проверьте этот блог, http://www.androiddevelopment.co.in/2019/05/how-to-save-android-activity-state.html, В этом блоге объясняется, как сохранить состояние активности при ее разрушении.

Например, если вы изменили язык вашего телефона во время выполнения действия (и поэтому необходимо загружать ресурсы, отличные от вашего проекта). Другой очень распространенный сценарий - это когда вы поворачиваете телефон в сторону, чтобы упражнение было воссоздано и отображено в альбомной ориентации. Вы можете использовать эту технику для хранения значений экземпляра для вашего приложения (выборки, несохраненный текст и т. Д.).

0 голосов
/ 29 апреля 2019

Фрагмент сохранит свое состояние только при воссоздании активности (например, поворот экрана) и изменение фрагмента не имеет значения.Из документации:

Существует много ситуаций, когда фрагмент может быть в основном разрушен (например, при помещении в задний стек без отображения пользовательского интерфейса), но его состояние не будет сохранено до тех пор, пока он не станет активным.фактически нужно сохранить его состояние.

Источник

Сохранение пользовательского состояния:

Поместить этот метод во фрагмент:

override fun onSaveInstanceState(outState: Bundle) {
    outState.putString("text", "some value")
    super.onSaveInstanceState(outState)
}

И прочитайте значение, например, внутри onViewCreated:

val text = savedInstanceState?.getString("text")

Вы получите желаемое значение после поворота экрана / изменения языка телефона или других изменений конфигурации - когдадействие (и фрагмент) воссоздается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...