2012-08-04 22 views
7

Nella mia attività principale, ho una barra delle azioni con NAVIGATION_MODE_TABS. Il contenuto di ciascuna scheda è un elencoframe.Transazioni frammento, barra delle azioni e backstack

Mi piacerebbe fare in modo che quando si fa clic su un listino, venga visualizzato un nuovo frammento e la modalità della barra delle azioni venga modificata in NAVIGATION_MODE_STANDARD (in modo che le schede siano ora nascoste).

sono riuscito a farlo funzionare con il seguente codice:

Nel metodo listitemclick:

 ActionBar actionBar = getActivity().getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 

     Fragment albumListFragment = new AlbumListFragment(); 
     albumListFragment.setArguments(bundle); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 

     ft.replace(android.R.id.content, albumListFragment); 
     ft.addToBackStack(null); 

     // Commit the transaction 
     ft.commit(); 

     Log.i("FragmentList", "Item clicked: " + id); 

Il problema è quando si preme il tasto back, le schede sono ancora andati, e il frammento precedente non torna in vista.

Sto facendo qualcosa di sbagliato .. È qualcosa a che fare con il frammento backstack? Dovrei farlo in un altro modo, o addirittura scavalcare il backpress?

--Edit--

Per chiarezza - che io chiamo addToBackStack quando chiamo fragmenttransaction.replace, ma quando si preme il pulsante Indietro, il frammento precedente non viene ripristinato.

+0

controllare questo collegamento una volta http://www.vogella.com/articles/Android/article.html#fragments_tutorial – shassss

+0

Grazie, ma non particolarmente utile per questa domanda .. –

+0

L'uso di addToBackStack è ciò che si desidera. http://developer.android.com/guide/components/fragments.html#Transactions – Frohnzie

risposta

-1

Il backstack termina l'attività corrente e passa all'attività precedente, non al frammento precedente. (Vedi la guida del backstack: http://developer.android.com/guide/components/tasks-and-back-stack.html).

È possibile forzare, come suggerito, il comportamento eseguendo l'override suBackPressed, tuttavia, non so che cambierei il comportamento naturale di Android in questo modo. Se guardi altre app, in particolare le app principali, che fanno cose simili, il pulsante Indietro non passa a un frammento precedente, ma un'attività precedente.

Inoltre, si ha il controllo totale sul comportamento del pulsante "su" (ovvero l'icona dell'app sulla barra delle azioni con la freccia sinistra). Devi programmarlo in modo programmato per essere usato come un pulsante come descritto nella guida di ActionBar (fammi sapere se hai bisogno di sapere come farlo) e con quello potresti averlo impostato su un frammento precedente su uno stack che mantenere da qualche parte.

+0

Dalla documentazione: prima di chiamare commit(), tuttavia, è possibile chiamare addToBackStack(), per aggiungere la transazione a una serie di transazioni di frammenti. Questo back stack è gestito dall'attività e consente all'utente di tornare allo stato del frammento precedente, premendo il pulsante Indietro. – Frohnzie

+0

@Frohnzie, grazie, ma il problema è che sto usando addToBAckStack(), e non sto ripristinando il frammento precedente quando torno indietro .. –

+0

@rascuache Il codice sembra corretto. Ho fatto esattamente la stessa cosa Non sono sicuro di quale sia il problema. Usare addToBackStack è la cosa giusta. Forse puoi pubblicare più codice. – Frohnzie

0

Ho riscontrato esattamente lo stesso problema e ho capito che il problema si verifica solo quando si imposta ActionBar su NAVIGATION_MODE_STANDARD.

L'unica soluzione per me è stato posizionare il nuovo frammento senza tabulazioni in un'attività di supporto che abbia NAVIGATION_MODE_STANDARD. Quindi puoi facilmente utilizzare la funzionalità del pulsante Indietro fornita da Android per tornare all'attività con NAVIGATION_MODE_TABS e mantenere il suo stato.

1

Forse è un po 'tardi, ho provato a ricostruire il problema per ore ma non ci sono riuscito. Ho provato a passare da un listview in un frammento ospitato da una scheda ActionBar a un'altra vista nel modo descritto nella domanda (ad esempio ft.replace (android.R.id.content, albumListFragment);) ma senza alcun effetto. Dopo un po 'di google e stackoverflow, io uso this way per cambiare con successo il frammento all'interno della scheda, ma senza alcun problema.

Come la "barra delle operazioni non viene visualizzata correttamente" problema, la sua, probabilmente causati dalla revert backstack e il cambiamento dell'interfaccia utente come descritto in android developer guide. potresti provare a sovrascrivere il callback onBackStackChanged() e ricostruire l'interfaccia utente.

Come il "backstack non porta il frammento precedente torna" problema, si consiglia di inviare un po 'più di codice per aiutare gli altri ricostruire il problema di trovare la risposta.

Desideri utile.

Problemi correlati