es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lanzando una actividad dentro de un fragmento específico, luego volviendo a la actividad anterior desde donde fue lanzada.

He estado luchando con un desafío particular que es el siguiente:

Mi aplicación tiene una actividad “A” que se considera la actividad “principal” de la aplicación. En un cierto punto, se lanza una actividad “B” que tiene una acción disponible que debería lanzar un fragmento dentro de la actividad “A” (esto no siempre será el mismo fragmento, dependerá de algunos datos que vienen de nuestro backend).

Puedo hacer esto simplemente llamando a startActivity con el Intent correcto, sin embargo, al presionar el botón de retroceso, vuelve al “fragmento principal” de A (esto es lógica implementada dentro de onBackPressed() de A). Básicamente, lo que debería suceder es lo siguiente:

Actividad A -> Actividad B -> Actividad A mostrando Fragmento X -> presionar retroceso -> Actividad B

Lo que sucede al usar startActivity para lanzar la Actividad A:

Actividad A -> Actividad B -> Actividad A mostrando Fragmento X -> presionar retroceso -> Actividad A mostrando el “fragmento principal”. A partir de aquí, si presiono retroceso nuevamente, la aplicación se cierra, lo cual, de nuevo, es parte de la implementación de onBackPressed() de A. Sin embargo, he intentado recuperar un “extra” del Intent que llamó a A con el fin de mostrar condicionalmente la actividad B, pero el Intent parecía estar vacío de extras por razones que no puedo entender. Estoy seguro de que estoy colocando correctamente los extras en el Intent, ya que la actividad A muestra el fragmento correcto cuando es invocado desde B basado en lo que pongo allí.

Más cosas que he intentado:

  • Lanzar el fragmento deseado directamente desde B, sin embargo, de esta manera, el fragmento no se muestra con la barra de navegación que existe en A y parece mostrar el contenido principal de la actividad B detrás de los elementos del fragmento, lo cual es indeseable en términos de experiencia de usuario.

  • Usar la bandera Intent.FLAG_ACTIVITY_REORDER_TO_FRONT, que parecía no hacer ninguna diferencia en absoluto.

Como esto es parte de la aplicación de mi empresa, que ya tiene un grado decente de complejidad, no puedo proporcionarte ejemplos de código útiles, y espero que mi descripción sea suficiente para que alguien pueda ayudarme.

Información adicional:

targetApi=”n”
Probando en Android 11
La Actividad A tiene launchMode “singleTask”
La Actividad B tiene launchMode “singleTop”

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para la navegación hacia atrás al lanzar un fragmento específico desde la Actividad B en Android

    Para resolver el problema de la navegación hacia atrás al lanzar un fragmento específico desde la Actividad B en Android, puedes utilizar FragmentManager para reemplazar el fragmento principal en la Actividad A con el fragmento deseado. De esta manera, cuando presiones el botón de retroceso, volverá a la actividad anterior, que es la Actividad B.

    Aquí tienes los pasos:

    1. En la Actividad A, crea un método para reemplazar el fragmento principal con el fragmento deseado:
      public void replaceFragment(Fragment fragment) {
          FragmentManager fragmentManager = getSupportFragmentManager();
          FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
          fragmentTransaction.replace(R.id.fragment_container, fragment);
          fragmentTransaction.addToBackStack(null);
          fragmentTransaction.commit();
      }
      

      Este método toma un objeto Fragment como parámetro, obtiene el FragmentManager, inicia una transacción, reemplaza el fragmento actual en el contenedor con el fragmento deseado, agrega la transacción a la pila de retroceso y realiza la transacción.

      El R.id.fragment_container es el ID del contenedor en la Actividad A donde se muestran los fragmentos.

    2. En la Actividad B, cuando se activa la acción para lanzar el fragmento deseado, utiliza un Intent para pasar los datos necesarios a la Actividad A y establece una bandera que indique que deseas lanzar el fragmento deseado:

      Intent intent = new Intent(this, ActivityA.class);
      intent.putExtra("data", data);
      intent.putExtra("launch_fragment", true);
      startActivity(intent);
      

      Aquí, "data" son los datos que provienen del backend y "launch_fragment" es la bandera que indica que deseas lanzar el fragmento deseado.

    3. En el método onCreate() de la Actividad A, verifica si la bandera "launch_fragment" está establecida y, si es así, obtén los datos del intent, crea el fragmento deseado y reemplaza el fragmento principal con él:

      if (getIntent().getBooleanExtra("launch_fragment", false)) {
          Bundle data = getIntent().getBundleExtra("data");
          Fragment fragment = new DesiredFragment();
          fragment.setArguments(data);
          replaceFragment(fragment);
      }
      

      Aquí, DesiredFragment es la clase del fragmento que deseas lanzar.

    4. Por último, asegúrate de que el método onBackPressed() de la Actividad A llame a super.onBackPressed() para permitir que la navegación hacia atrás funcione correctamente.

      Con esta solución, puedes lanzar el fragmento deseado desde la Actividad B y, cuando presiones el botón de retroceso, volverás a la Actividad B.

    ¡Espero que esto te ayude!

Comments are closed.