Kotlin ¿Cómo implementar onBackPressed () en Fragments?


Si te preguntas ¿Hay alguna forma en que podamos implementar onBackPressed () en Android Fragment de forma similar como se implementa en Android Activity?

Usando onBackPressedDispatcher

Si se desea interceptar la acción ir hacia atrás des de un fragmento, la manera más directa y oficial, es usando el método OnBackPressedCallback pertanece en androidx.activity.

Ese método permité registrar como escuchador y así interceptar cuando el usuario pulsa ir hacia atrás.

En el fragmento donde queremos interceptar la acción ir hacia atrás añadir

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setHasOptionsMenu(true)

    val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {

    //mostrar un dialogo de salida etc...

    }

}

Al interceptar el onBackPressed se pausa su progresión, si deseamos continuar con ir atrás, dentro de la intercepción añadir

if (!findNavController().navigateUp()) {
    if (isEnabled) {
        isEnabled = false
    }
}

Propagando onBackPressed a un fragmento

Para poder interceptar el evento onBackPressed estando en un fragmento, se debe propagar el evento hacia el fragmento usando un interface IOnBackPressed

interface IOnBackPressed {
    fun onBackPressed(): Boolean
}

En la actividad sobrescribir el evento onBackPressed

class MyActivity : AppCompatActivity() {
    override fun onBackPressed() {
        val fragment = this.supportFragmentManager.findFragmentById(R.id.main_container)
        (fragment as? IOnBackPressed)?.onBackPressed()?.not()?.let { isCanceled: Boolean ->
            if (!isCanceled) super.onBackPressed()
        }
    }
}

El fragmento debe extender de la inteface IOnBackPressed

class MyFragment : Fragment(), IOnBackPressed {
    override fun onBackPressed(): Boolean {
        return if (/*tu_condición*/) {
            true //permitir ir atrás
        } else {
            false //cancelar acción 
        }
    }
}

Usando Navigation Controller

Si usas el componente Navigation Controller de los Componentes de arquitectura de Android

class MyActivity : AppCompatActivity() {
    ...
    override fun onBackPressed() {
        val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
        navHost?.let { navFragment ->
            navFragment.childFragmentManager.primaryNavigationFragment?.let { fragment ->
                (fragment as? IOnBackPressed)?.onBackPressed()?.not()?.let { isCanceled: Boolean ->
                    Toast.makeText(this, "onBackpressed " + isCanceled, Toast.LENGTH_SHORT).show()
                    if (!isCanceled) {
                        super.onBackPressed()
                    }
                }
            }
        }
    }
}

Recursos

Anuncio publicitario

Publicado por Codelaby

Mobile DevDesigner

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: