¿Cómo implementar onBackPressed() en Fragments?

¿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

  1. Crear la interfaz de clase OnBackPressedListener.

    public interface OnBackPressedListener {
        public void doBack();
    }
  2. 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);
        }
    }
  3. A partir de ahora, trabajaremos sobre nuestro código BaseActivity y sus fragmentos

  4. Crea un listener privado sobre tu clase BaseActivity.

    protected OnBackPressedListener onBackPressedListener;
  5. Crear un método para establecer el listener en BaseActivity.

    public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
        this.onBackPressedListener = onBackPressedListener;
    }
  6. en override onBackPressed implementar algo así

    @Override
    public void onBackPressed() {
        if (onBackPressedListener != null)
            onBackPressedListener.doBack();
        si no
            super.onBackPressed();
  7. 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.

Comentarios (6)

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.

Comentarios (7)

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.

Comentarios (3)