studio regresar programar pasar pantallas otro navegar navegacion llamar fragments entre desde boton atras anterior activity android fragment back

android - regresar - ¿Cómo volver al fragmento anterior al presionar el botón de retroceso manual del fragmento individual?



programar boton atras android (10)

El botón Atrás se desplazará en el orden en que se agregaron los Fragmentos a backstack . Esto se proporciona como una función de navegación por defecto. Ahora, si quiere ir a un Fragmento específico, puede mostrarlo desde el backstack.

Tengo solo una activity y múltiples fragments en mi aplicación.

Dos fragmentos principales A (izquierda) y B (derecha).

Fragment A1 called from A B1 called from B B2 called from B1

Todos los fragments tienen botones de respaldo individuales.

Entonces, cuando presiono el botón Atrás del fragment A1 , debería volver a A , de manera similar cuando se presiona el botón Atrás desde B2 , aparece B1 y de B1 a B, y así sucesivamente.

¿Cómo implementar este tipo de funcionalidad?


Implementé el Escenario similar en este momento.

Actividad ''A'' -> Llama a un Fragmento ''A1'' y haciendo clic en el elemento del menú, llama al Fragmento ''A2'' y si el usuario presiona el botón Atrás desde ''A2'', esto vuelve a ''A1'' y si el usuario presiona de regreso de ''A1'' después de eso, termina la Actividad ''A'' y regresa.

Ver el siguiente código:

Actividad ''A'' - Método OnCreate ():

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activityA); if (savedInstanceState == null) { Fragment fragInstance; //Calling the Fragment newInstance Static method fragInstance = FragmentA1.newInstance(); getFragmentManager().beginTransaction() .add(R.id.container, fragInstance) .commit(); } }

Fragmento: ''A1''

Estoy reemplazando el fragmento existente con el nuevo Fragmento cuando ocurre la acción de clic del elemento del menú:

@Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_edit_columns) { //Open the Fragment A2 and add this to backstack Fragment fragment = FragmentA2.newInstance(); this.getFragmentManager().beginTransaction() .replace(R.id.container, fragment) .addToBackStack(null) .commit(); return true; } return super.onOptionsItemSelected(item); }

Actividad ''A'' - onBackPressed () Método:

Como todos los fragmentos tienen una Actividad principal (que es ''A''), el método onBackPressed () te permite mostrar fragmentos, si hay alguno, o simplemente regresar a la Actividad anterior.

@Override public void onBackPressed() { if(getFragmentManager().getBackStackEntryCount() == 0) { super.onBackPressed(); } else { getFragmentManager().popBackStack(); } }

Si busca Fragmentos de inserción dentro de Fragmentos, consulte el siguiente enlace: http://developer.android.com/about/versions/android-4.2.html#NestedFragments


La respuesta de @blueblue me puso en marcha con un problema menor pero molesto. Cuando solo hay un fragmento en la copia posterior y presiona el botón Atrás, ese marco se elimina y la aplicación permanece activa con una pantalla en blanco. El usuario necesitaba presionar el botón Atrás una vez más para salir de la aplicación. Modifiqué el código original a lo siguiente para manejar esta situación

@Override public void onBackPressed() { if(getFragmentManager().getBackStackEntryCount() == 0) { super.onBackPressed(); } else if(getFragmentManager().getBackStackEntryCount() == 1) { moveTaskToBack(false); } else { getFragmentManager().popBackStack(); } }

Cuando solo hay 1 fragmento en la backstack, básicamente le estamos diciendo a Android que mueva toda la aplicación a la parte posterior.

Actualización (y probablemente una mejor respuesta)

Entonces, después de leer un poco más acerca de esto, descubrí que puedes agregar transacciones de administrador de fragmentos a la pila de respaldo y, a continuación, las manecillas de Android retroceden automáticamente y de la manera deseada. El siguiente fragmento de código muestra cómo hacerlo

Fragment fragment; //Create and instance of your fragment class here FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null); fragmentTransaction.commit(); fragmentTransaction.addToBackStack(null);

La última línea muestra cómo agregar una transacción a la pila trasera. Esto resuelve el problema de la imprenta en busca de fragmentos en la mayoría de las situaciones, excepto en una. Si continúa presionando el botón Atrás, eventualmente llegará a un punto en el que solo hay un fragmento en la pila posterior. En este punto, querrás hacer una de las dos cosas

  1. Elimine la actividad que contiene el fragmento de la pila posterior de la tarea en la que se está ejecutando la actividad. Esto se debe a que no desea terminar con una actividad en blanco
  2. Si la actividad es la única actividad en la pila posterior de la tarea, luego empuje la tarea en segundo plano.

En mi caso, fue el último, así que modifiqué el método onBackPressed anulado de mi respuesta anterior para que se vea a continuación

@Override public void onBackPressed() { if(getFragmentManager().getBackStackEntryCount() == 1) { moveTaskToBack(false); } else { super.onBackPressed(); } }

Este código es más simple porque tiene menos lógica y se basa en el marco que en nuestro código personalizado. Lamentablemente, no logré implementar el código para la primera situación, ya que no era necesario.


Prueba esto, es un trabajo para mí.

public void onBackPressed() { if (mainLayout.isMenuShown()) { mainLayout.toggleMenu(); } else { FragmentManager fm = getSupportFragmentManager(); Log.print("back stack entry", fm.getBackStackEntryCount() + ""); if (fm.getBackStackEntryCount() > 1) { fm.popBackStack(); // super.onBackPressed(); // return; } else { if (doubleBackToExitPressedOnce) { fm.popBackStack(); super.onBackPressed(); return; } this.doubleBackToExitPressedOnce = true; Toast.makeText(this, "Press one more time to exit", Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { doubleBackToExitPressedOnce = false; } }, 3000); } } }


Puede manejarlo agregando etiquetas en backStack . Verifique mi respuesta aquí:

https://.com/a/19477957/1572408

Espero eso ayude


Si presiona la imagen hacia atrás, primero debe crear un método como este

private void Backpresses() { getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contant_main, new Home()).commit(); }

entonces tienes que llamar así cuando presionas la imagen hacia atrás ...

back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Backpresses(); } });

Funciona bien para mí


Solo haz

getActivity().getFragmentManager().popBackStack();


Tienes que implementar tu propia implementación de backstack como se explica here.

Puede llamar a los popFragments() siempre que haga clic en el botón Atrás en un fragmento y llame a pushFragments() cada vez que navegue de un Fragmento a otro.


@Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ // replace your fragment here return true; } return false; } }); }

// Happy Coding


public void onBackPressed() { FragmentManager fm = getActivity().getSupportFragmentManager(); fm.popBackStack(); }