2012-08-04 11 views
7

In meiner Haupttätigkeit habe ich eine Actionbar mit NAVIGATION_MODE_TABS. Der Inhalt jeder Registerkarte ist ein Listenfragment.Fragment Transaktionen, Actionbar & Backstack

Ich möchte es so machen, dass, wenn ein Listeneintrag angeklickt wird, ein neues Fragment in Sicht gebracht wird, und der Aktionsleistenmodus auf NAVIGATION_MODE_STANDARD geändert wird (so dass die Registerkarten jetzt ausgeblendet sind).

Ich habe es geschafft, dies mit dem folgenden Code zur Arbeit zu kommen:

Im listitemclick Methode:

 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); 

Das Problem ist, wenn ich die Zurück-Taste drücken, werden die Laschen noch gegangen und das vorherige Fragment kommt nicht wieder in Sicht.

Mache ich etwas falsch .. Hat es etwas mit dem Fragment Backstack zu tun? Sollte ich es anders machen oder sogar die Rückpressung außer Kraft setzen?

--Edit--

Aus Gründen der Klarheit - Ich rufe addToBackStack wenn ich fragmenttransaction.replace nennen, aber wenn ich die Zurück-Taste drücken, wird das vorherige Fragment nicht wiederhergestellt.

+0

Überprüfen Sie diesen Link einmal http://www.vogella.com/articles/Android/article.html#fragments_tutorial – shassss

+0

Vielen Dank, aber nicht besonders hilfreich für diese Frage .. –

+0

Mit addToBackStack ist was Sie wollen. http://developer.android.com/guide/components/fragments.html#Transactions – Frohnzie

Antwort

-1

Der Backstack beendet die aktuelle Aktivität und geht zur vorherigen Aktivität, nicht zum vorherigen Fragment. (Siehe den Backstack-Leitfaden: http://developer.android.com/guide/components/tasks-and-back-stack.html).

Sie könnten, wie Sie vorgeschlagen, das Verhalten durch Überschreiben onBackPressed erzwingen, aber ich weiß nicht, dass ich das natürliche Android-Verhalten auf diese Weise ändern würde. Wenn Sie sich andere Apps ansehen, insbesondere Core-Apps, die ähnliche Aufgaben ausführen, wird die Zurück-Schaltfläche nicht auf ein vorheriges Fragment, sondern auf eine vorherige Aktivität zurückgesetzt.

Sie haben auch die totale Kontrolle über das Verhalten der Schaltfläche "nach oben" (das ist Ihr App-Symbol in der Aktionsleiste mit einem Pfeil nach links). Sie müssen es programmatisch so einrichten, dass es als eine Schaltfläche verwendet wird, wie im ActionBar-Handbuch beschrieben (lassen Sie es mich wissen, wenn Sie wissen müssen, wie das geht), und damit könnte es ein vorheriges Fragment auf einem Stapel von Ihnen einrichten irgendwo pflegen.

+0

Aus der Dokumentation: Bevor Sie commit() aufrufen, sollten Sie jedoch addToBackStack() aufrufen, um die Transaktion einem Backstapel von Fragmenttransaktionen hinzuzufügen. Dieser Backstack wird von der Aktivität verwaltet und ermöglicht es dem Benutzer, durch Drücken der Zurück-Taste zum vorherigen Fragmentstatus zurückzukehren. – Frohnzie

+0

@Frohnzie danke dafür, aber das Problem ist, ich verwende addToBAckStack(), und es ist nicht die Wiederherstellung des vorherigen Fragments, wenn ich zurück drücke .. –

+0

@rascuache Code sieht richtig aus. Ich habe genau das Gleiche gemacht. Ich bin mir nicht sicher, was das Problem ist. Mit addToBackStack ist das Richtige. Vielleicht kannst du mehr Code posten. – Frohnzie

0

Ich habe genau das gleiche Problem festgestellt und festgestellt, dass das Problem nur auftritt, wenn Sie die ActionBar auf NAVIGATION_MODE_STANDARD zurückgesetzt.

Die einzige Lösung für mich war, das neue Fragment ohne Registerkarten in eine Hilfsaktivität, die NAVIGATION_MODE_STANDARD hat, zu platzieren. Dann können Sie die von Android zur Verfügung gestellte Zurück-Schaltflächen-Funktionalität verwenden, um zu der Aktivität mit NAVIGATION_MODE_TABS zurückzukehren und ihren Status beizubehalten.

1

Vielleicht ist dies ein wenig spät, ich habe versucht, Ihr Problem für Stunden neu zu konstruieren, aber nicht erfolgreich. Ich habe versucht, von einer Listview in einem Fragment von einer ActionBar Registerkarte zu einer anderen Ansicht auf die in Ihrer Frage beschriebenen Weise (d. H. Ft.replace (android.R.id.content, albumListFragment);), aber ohne Wirkung. Nach einigem google und stackoverflow verwende ich this way, um das Fragment erfolgreich innerhalb der Registerkarte zu wechseln, aber ohne Probleme, wie Sie haben.

Da die "Aktionsleiste wird nicht korrekt angezeigt" Problem, ist es wahrscheinlich durch den Backstack verursacht Rücksetzen und UI ändern, wie in android developer guide beschrieben. Sie könnten versuchen, den Rückruf onBackStackChanged() zu überschreiben und die Benutzeroberfläche neu zu erstellen.

Da der "backstack bringt das vorherige Fragment zurück" Problem, möchten Sie möglicherweise ein wenig mehr Code, um anderen zu helfen, das Problem neu zu konstruieren, um die Antwort zu finden.

Wünschen Sie hilfreich.

Verwandte Themen