2011-10-19 17 views
9

in un frammento, chiamato in una delle attività che sto visualizzando un elenco di linee di autobus in questo modo:Modifica ActionBar quando si utilizza frammenti

Page 1, when opening for the first time.

Poi, una volta che l'utente fa clic su "Stazioni", mi piace per mostrare un elenco di stazioni, naturalmente. 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à è:

<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 visualizzata sopra l'altro:

After clicking on the Station List button

Ciò che funziona bene è ActionBar, ora contiene correttamente il titolo solo.

Ciò che non funziona è se si preme indietro ora. la lista delle stazioni è nascosto, ma il vecchio ActionBar non viene ripristinato:

ActionBar after coming back from List button

I documenti dicono che il modo per aggiungere l'ActionBar sta usando metodi onCreateOptionsMenu ecc

Così, in LongDistanceFragment (la prima quella mostrata), sto creando il bar come questo:

@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 viene ripristinata una volta che l'utente è tornato in quel frammento.

Penso che un modo per ripristinare lo stato di ActionBar quando è necessario eseguire il rollback della transazione Fragment.

Cosa mi manca? Grazie per qualsiasi aiuto.

+0

Anche io sto combattendo con questo al momento. Ecco una domanda correlata. http://stackoverflow.com/questions/6503189/fragments-onresume-from-back-stack –

risposta

9

Se ho compreso correttamente il codice, è probabile che il problema sia compreso tra StationListFragment.

L'ActionBar è associata all'attività stessa, non a un particolare frammento al suo interno.

Sto immaginando che all'interno di StationListFragment stai modificando l'ActionBar per visualizzare il titolo "Stations" e disattivare la modalità di navigazione Elenco. In tal caso, premendo il pulsante Indietro si annulla la transazione, eliminando in modo efficace StationListFragment, ma non annullando automaticamente le modifiche apportate alla barra delle azioni di Activity.

Ciò che è necessario fare è sovrascrivere uno dei gestori di modifica dello stato all'interno del frammento dell'elenco delle stazioni per annullare le modifiche di ActionBar quando viene rimosso/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 in modo che impostarlo in modo appropriato quando diventano visibili (ignorando onResume) anziché tentare di ripulire dopo essere stato rimosso.

+2

Nessuno dei gestori di modifica dello stato di ListFragment viene effettivamente chiamato affatto, quindi non è possibile farlo. Questo è un errore nell'API. –

+1

Sto usando la sostituzione ma sto aggiungendo la vista dettagliata allo stack posteriore. E poi, quando viene premuto il pulsante Indietro, nessun evento viene attivato nell'elenco per poter reimpostare il titolo. –

+0

Quindi dove sta cambiando il titolo di ActionBar? In base al codice in questo esempio, non dovrebbe mai visualizzare "Bus Line Stops" - Devo presumere che stia succedendo in StationListFragment. –

1

Avevo a che fare con lo stesso problema e quando ripristino le modifiche a ActionBar nel metodo onStop del secondo frammento, funziona correttamente.

Problemi correlati