Domanda

In un frammento, chiamato in una delle attività che sto visualizzando un elenco di linee di autobus in questo modo:

Pagina 1, quando l'apertura per la prima volta.

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:

Dopo aver cliccato sul pulsante List Stazione

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.

ActionBar dopo il ritorno dal pulsante List

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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top