¿Cómo mantener el estado del fragmento después de reemplazar la transacción?

Tengo dos fragmentos (supongamos FragmentA y FragmentB ) en una aplicación de Android que cambio entre usar una BottomBar .

Tengo una lista de datos que se están obteniendo usando Retrofit que estoy mostrando usando un RecyclerView en FragmentA y tengo un MapView en FragmentB .

Mi problema es que cada vez que cambio de FragmentB a FragmentA , las llamadas a la API recuperan la lista de datos nuevamente . Y cuando cambio de FragmentA a FragmentB, MapView se vuelve a representar desde el principio.

¿Hay alguna forma de mantener el estado del Fragmento A, es decir, la lista de datos tal como está hasta que destruya la Actividad? y para mantener el MapView en FragmentB como está?

Usé lo siguiente para reemplazar un fragmento.

public void replaceFragment(Fragment fragment // This can be FragmentA or FragmentB) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.framelayout, fragment);
        transaction.commit();
    }

Solo quiero fragmentos para mantener su estado y no reiniciar todo hasta que se destruya la actividad. Supongo que los métodos del ciclo de vida de los fragmentos juegan un papel importante aquí.

Cualquier ayuda es apreciada. ¡Gracias!

Respuesta 1

En MyActivity, declare los dos objetos de fragmentos anteriores en onCreate:

private Fragment1 fragment1 = new Fragment1();
private Fragment2 fragment1 = new Fragment2();

Al hacer clic en BottomBar, puede configurar el clic para que ambos fragmentos se muestren y se oculten.

Establecer fragmento1 seleccionado

private void fragment1Selected() {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (fragment1 == null || !fragment1.isAdded()) {
            fragment1 = new Fragment1();
            transaction.add(R.id.framelayout, fragment1);
        } else {
            transaction.show(fragment1);
        }

        if (fragment2 != null)
            transaction.hide(fragment2);

        transaction.commit();
    }

Establecer fragmento2 seleccionado

private void fragment2Selected() {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (fragment2 == null || !fragment2.isAdded()) {
            fragment2 = new Fragment2();
            transaction.add(R.id.framelayout, fragment2);
        } else {
            transaction.show(fragment2);
        }

        if (fragment1 != null)
            transaction.hide(fragment1);

        transaction.commit();
    }
Respuesta: 2

Los componentes de arquitectura se adaptan mejor a su escenario. Use LiveData y ViewModel .

  1. Dentro de la actividad, cree un modelo de vista y actualice los datos en vivo con la respuesta del servidor.

  2. En el Fragmento, use los datos en vivo para actualizar las vistas.

En este caso, el ciclo de vida de ViewModel se adjunta a la actividad y las transacciones fragmentadas no afectarán los datos almacenados. Como está actualizando los datos de LiveData, solo se realizará una llamada API cuando se cree la actividad. Además de eso, ViewModel sobrevive a los cambios de orientación, lo que significa que su LiveData aún conserva la respuesta API.

Respuesta: 3

He estado tratando de entender los conceptos de Maven y me resulta difícil entender la terminología utilizada. Encontré este término "mapeo del ciclo de vida de la construcción". ¿Alguien podría darme un claro ...

Estoy tratando de crear un triángulo descendente de números como este en Java: 4 3 3 2 2 2 1 1 1 1 El usuario ingresa el primer número y luego se supone que crea el descendente ...

Tengo un archivo de registro que será actualizado por un script de shell. Este script de shell tiene varias operaciones y actualiza el archivo después de cada operación, indicando que la operación ha finalizado. Ahora necesito ...

¿Cómo podría justificar algunos números correctamente? No entiendo. Soy realmente nuevo en Java. : - / Por ejemplo, cada vez que trato de hacer que este código esté justificado me da errores. Aquí hay una muestra ...