Cambiando ActionBar utilizzando frammenti
-
26-10-2019 - |
Domanda
In un frammento, chiamato in una delle attività che sto visualizzando un elenco di linee di autobus in questo modo:
Poi, una volta che l'utente fa clic su "Stazioni", mi piace mostrare un elenco di stazioni di corso. Sto usando questo codice:
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();
}
}
L'XML per questa attività è il seguente:
<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 è un semplice ListFragment visualizzato sopra l'altro:
Ciò che funziona bene se è l'ActionBar, ora contiene correttamente solo il titolo.
Che cosa non funziona è che se io premere Indietro oggi l'elenco delle stazioni è nascosto, ma il vecchio ActionBar non viene ripristinato.
I documenti dicono che il modo per aggiungere l'ActionBar sta usando metodi onCreateOptionsMenu ecc
Quindi, nella LongDistanceFragment (il primo mostrato), sto creando la barra in questo modo:
@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);
}
Ma in qualche modo non è ripristinata una volta che l'utente è tornato in quel frammento.
Penso che un modo per recuperare lo stato del ActionBar quando rollback il Frammento transazione è necessario.
Che cosa mi manca? Grazie per qualsiasi aiuto.
Soluzione
Se ho capito il codice correttamente, il problema è probabile che all'interno della vostra StationListFragment
.
L'ActionBar è associato con la stessa attività, non un frammento particolare all'interno di esso.
Sto indovinando che all'interno del StationListFragment si sta modificando l'ActionBar per visualizzare il titolo di "stazioni" e disattivare la modalità di navigazione List. In tal caso, premendo il tasto back annulla la transazione - eliminando efficacemente lo StationListFragment - ma non automagicamente annullare le modifiche si potrebbe apportate al di attività azione barra
.Che cosa hai bisogno di fare è di override uno dei gestori di modifica dello stato all'interno del tuo elenco stazioni Frammento di annullare l'ActionBar cambia quando viene rimossa / nascosto.
Un approccio migliore sarebbe quella di utilizzare una transazione replace
di scambiare la LongDistanceFragment
con il StationListFragment
(piuttosto che aggiungere il secondo in cima al primo.) Quindi è possibile aggiungere il codice per configurare la barra delle azioni per ogni frammento così si mettevano esso in modo appropriato quando diventano visibili (sovrascrivendo onResume
) piuttosto che cercare di pulire dopo uno è stato rimosso.
Altri suggerimenti
avevo a che fare con lo stesso problema e quando ho Ripristina modifiche ActionBar nel metodo onStop
del secondo frammento, funziona benissimo.