¿Existe una forma de implementar onBackPressed()
en Android Fragment de forma similar a la que implementamos en Android Activity?
Ya que el ciclo de vida de Fragment no tiene onBackPressed()
. ¿Existe algún otro método alternativo para sobrepasar onBackPressed()
en los fragmentos de Android 3.0?
De acuerdo con la respuesta de @HaMMeRed aquí está el pseudocódigo de cómo debería funcionar.
Digamos que su actividad principal se llama BaseActivity
que tiene fragmentos hijo (como en SlidingMenu lib ejemplo).
Aquí están los pasos:
Primero necesitamos crear una interfaz y una clase que implemente su interfaz para tener un método genérico
Crear la interfaz de clase OnBackPressedListener
.
public interface OnBackPressedListener {
public void doBack();
}
Crear una clase que implemente las habilidades de OnBackPressedListener
.
public class BaseBackPressedListener implements OnBackPressedListener {
private final FragmentActivity activity;
public BaseBackPressedListener(FragmentActivity activity) {
this.activity = activity;
}
@Override
public void doBack() {
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
A partir de ahora, trabajaremos sobre nuestro código BaseActivity
y sus fragmentos
Crea un listener privado sobre tu clase BaseActivity
.
protected OnBackPressedListener onBackPressedListener;
Crear un método para establecer el listener en BaseActivity
.
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
en override onBackPressed
implementar algo así
@Override
public void onBackPressed() {
if (onBackPressedListener != null)
onBackPressedListener.doBack();
si no
super.onBackPressed();
en tu fragmento en onCreateView
debes añadir nuestro listener
@Override
public View onCreateView(LayoutInflater inflador, ViewGroup contenedor, Bundle savedInstanceState) {
activity = getActivity();
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
Vista = ... ;
//cosas con la vista
devuelve la vista;
}
Voilà, ahora al hacer clic en el fragmento de vuelta debe coger su método personalizado de vuelta.
Si quisieras este tipo de funcionalidad tendrías que anularla en tu actividad, y luego añadir una interfaz YourBackPressed
a todos tus fragmentos, que llamarías en el fragmento correspondiente cada vez que se pulsara el botón de retroceso.
Edición: Me gustaría añadir mi respuesta anterior.
Si tuviera que hacer esto hoy, utilizaría una emisión, o posiblemente una emisión ordenada si esperara que otros paneles se actualizaran al unísono con el panel de contenido principal.
El LocalBroadcastManager
en la Biblioteca de Soporte puede ayudar con esto, y sólo tienes que enviar la emisión en onBackPressed
y suscribirte en tus fragmentos que te interesan. Creo que Messaging es una implementación más desacoplada y escalaría mejor, por lo que sería mi recomendación oficial de implementación ahora. Simplemente usa la acción Intent
como filtro para tu mensaje. envía tu recién creada ACTION_BACK_PRESSED
, envíala desde tu actividad y escúchala en los fragmentos pertinentes.
Sólo tienes que añadir addToBackStack
mientras haces la transición entre tus fragmentos como se indica a continuación:
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
si escribes addToBackStack(null)
, lo manejará por sí mismo pero si le das una etiqueta, deberás manejarlo manualmente.