es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo encontrar un fragmento en el backstack para navegar hacia él sin recrearlo?

Estoy utilizando el componente de navegación. Mi fragmento principal se abre por defecto. Cuando navego hacia otro fragmento en mi barra de navegación inferior, puedo hacer clic en un elemento de la vista en cuadrícula y debería volver a mi fragmento principal y enviar argumentos. El problema es que está recreando mi fragmento principal, por lo que mi modelo de vista de este fragmento también se recrea. Estoy utilizando este método para navegar haciendo clic en un elemento:

findNavController().navigate(NavGraphDirections.actionGlobalMainFragment(schemeId))

¿Puedo encontrar este fragmento de alguna manera en la pila de retroceso (porque está en ella) y navegar a él sin recrearlo y enviando argumentos?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar el método findFragmentByTag para encontrar un fragmento en la pila de fragmentos por su etiqueta y luego navegar a él sin recrearlo.

    Primero, debes agregar una etiqueta a tu fragmento principal cuando se crea por primera vez y se agrega a la pila de fragmentos. Puedes hacer esto pasando un parámetro de etiqueta al método addToBackStack:

    val mainFragment = MainFragment.newInstance()
    supportFragmentManager.beginTransaction()
        .add(R.id.fragment_container, mainFragment, "MAIN_FRAGMENT_TAG")
        .addToBackStack("MAIN_FRAGMENT_TAG")
        .commit()
    

    Luego, para navegar de regreso al fragmento principal sin recrearlo, puedes usar el método findFragmentByTag para obtener una referencia al fragmento y verificar si ya está agregado a la pila de fragmentos:

    val mainFragment = supportFragmentManager.findFragmentByTag("MAIN_FRAGMENT_TAG") as? MainFragment
    if (mainFragment != null && mainFragment.isAdded) {
        // El fragmento ya está agregado, entonces navega a él sin recrearlo
        val action = MainFragmentDirections.actionGlobalMainFragment(schemeId)
        findNavController().navigate(action)
    } else {
        // El fragmento no está agregado, entonces créalo de nuevo y agrégalo a la pila de fragmentos
        val newMainFragment = MainFragment.newInstance()
        supportFragmentManager.beginTransaction()
            .add(R.id.fragment_container, newMainFragment, "MAIN_FRAGMENT_TAG")
            .addToBackStack("MAIN_FRAGMENT_TAG")
            .commit()
    }
    

    Este código verifica si el fragmento principal ya está agregado a la pila de fragmentos, y si es así, navega a él sin recrearlo. Si no está agregado, recrea el fragmento y lo agrega a la pila de fragmentos con la misma etiqueta.

Comments are closed.