Pregunta

En un fragmento, llamado dentro de una actividad, estoy mostrando una lista de líneas de autobuses como esta:

Page 1, when opening for the first time.

Luego, una vez que el usuario hace clic en "estaciones", me gusta mostrar una lista de estaciones, por supuesto. Estoy usando este código:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.act_long_distance);

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.f_long_distance, new LongDistanceFragment()).commit();
}

@SuppressWarnings({"UnusedDeclaration"})
public void showStationList(View view) {
    String tag = (String) view.getTag();
    if (tag != null && tag.length() > 0) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        StationListFragment fragment = new StationListFragment(tag.split(","));
        ft.add(R.id.f_long_distance, fragment);
        // ft.replace(R.id.f_long_distance, fragment);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.addToBackStack(null);
        ft.commit();
    }
}

El XML para esta actividad es:

<LinearLayout
    android:id="@+id/ll_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <FrameLayout
        android:id="@+id/f_long_distance"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</LinearLayout>

StationListFragment es un simple Fragmento de list Mostrado en la parte superior del otro:

After clicking on the Station List button

Sin embargo, lo que funciona bien es la barra de acción, ahora contiene adecuadamente el título solamente.

Lo que no funciona es si presiono espalda ahora. La lista de la estación está oculta, pero la antigua Action Bar no está restaurada:

ActionBar after coming back from List button

Los documentos dicen que la forma de agregar la barra de acción es utilizar los métodos OnCreateeCtionsMenu, etc.

Entonces, en LongdistanceFragment (el primero que se muestra), estoy creando la barra de esta manera:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    Log.d(TAG, "onViewCreated");
    super.onViewCreated(view, savedInstanceState);

    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);

    ActionBar bar = getSupportActivity().getSupportActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    bar.setListNavigationCallbacks(new SimpleSpinnerArrayAdapter(getActivity()), this);
}

Pero de alguna manera no se restaura una vez que el usuario está de vuelta en ese fragmento.

Creo que se necesita una forma de recuperar el estado de la barra de acción cuando se necesita revertir la transacción del fragmento.

¿Qué me estoy perdiendo? Gracias por cualquier ayuda.

¿Fue útil?

Solución

Si entiendo correctamente su código, el problema es probable dentro de su StationListFragment.

La barra de acción está asociada con la actividad misma, no con un fragmento particular dentro de ella.

Supongo que dentro de StationListFragment está modificando la barra de acción para mostrar el título de "estaciones" y deshabilitar el modo de navegación de la lista. En ese caso, presionar el botón Atrás deshace la transacción, eliminando efectivamente el StationListFragment, pero no deshace automáticamente los cambios que podría haber realizado en la barra de acción de la actividad.

Lo que deberá hacer es anular uno de los controladores de cambio de estado dentro de su fragmento de lista de estaciones para deshacer los cambios de la barra de acción cuando se elimina / oculta.

Un mejor enfoque sería usar un replace transacción para intercambiar el LongDistanceFragment con el StationListFragment (en lugar de agregar el último encima del primero). Luego puede agregar el código para configurar la barra de acción en cada fragmento para que lo configuren adecuadamente cuando se vuelvan visibles (anulando onResume) en lugar de tratar de limpiar después de que se ha eliminado uno.

Otros consejos

Estaba lidiando con el mismo problema y cuando revertí los cambios en Action Carn en el onStop Método del segundo fragmento, funciona bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top