Cambiar la barra de acción al usar fragmentos
-
26-10-2019 - |
Pregunta
En un fragmento, llamado dentro de una actividad, estoy mostrando una lista de líneas de autobuses como esta:
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:
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:
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.
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.