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
- En la documentación de Google lo implementa de la siguiente manera Cómo proporcionar navegación hacia atrás personalizada