Bei Verwendung der Navigationsleiste empfehlen die Android-Entwickler, dass in der Aktionsleiste "nur die Bildschirme, die in der Navigationsleiste dargestellt werden, tatsächlich das Bild der Navigationsleiste haben sollten" und dass "alle anderen Bildschirme das traditionelle Up-Carat-Format haben".
Einzelheiten finden Sie hier: http://youtu.be/F5COhlbpIbY
Ich verwende eine Aktivität, um mehrere Ebenen von Fragmenten zu steuern, und kann das Bild der Navigationsschublade auf allen Ebenen anzeigen und funktionieren lassen.
Beim Erstellen von Fragmenten niedrigerer Ebenen kann ich das aufrufen ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
, um das Bild der Navigationsschublade auszublenden und das Caret Up anzuzeigen
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
Das Problem, das ich habe, ist, wenn ich zurück zu den Fragmenten der obersten Ebene navigiere, die das Up-Karat anstelle des ursprünglichen Navigationsschubladenbilds weiterhin anzeigt. Irgendwelche Vorschläge, wie Sie die ActionBar auf den Fragmenten der obersten Ebene "aktualisieren" können, um das Bild der Navigationsleiste wieder anzuzeigen?
Lösung
Toms Vorschlag hat bei mir funktioniert. Folgendes habe ich getan:
Hauptaktivität
Diese Aktivität steuert alle Fragmente in der App.
Wenn ich neue Fragmente vorbereite, um andere zu ersetzen, stelle ich den DrawerToggle folgendermaßen ein setDrawerIndicatorEnabled(false)
:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
Als nächstes habe onBackPressed
ich in einem Override von das oben Gesagte rückgängig gemacht, indem ich DrawerToggle so eingestellt habe, dass es setDrawerIndicatorEnabled(true)
wie folgt aussieht :
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
In den LowerLevelFragments
In den Fragmenten habe ich modifiziert onCreate
und onOptionsItemSelected
mag das:
Wird onCreate
hinzugefügt setHasOptionsMenu(true)
, um die Konfiguration des Optionsmenüs zu aktivieren. Auch setzen setDisplayHomeAsUpEnabled(true)
die aktivieren < in der Aktionsleiste :
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
Dann , onOptionsItemSelected
wenn die < gedrückt wird es ruft die onBackPressed()
von der Aktivität einer Ebene in der Hierarchie nach oben und in der Navigationsleiste Bild anzuzeigen:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
.replace(R.id.frag_layout
. Wenn dies eine weitere Hierarchieebene ist, würde ich erwarten, dass Sie.add
es in den Backstack.theDrawerToggle.setDrawerIndicatorEnabled(false);
Innere des Fragments? Ich denke, es ist in der Hauptaktivitätsklassendatei deklariert. Ich kann keinen Weg finden, darauf zu verweisen. Irgendwelche Hinweise?setDisplayOptions()
Methode imToolbarWidgetWrapper
(des internen Pakets android.support.v7.internal.widget) das Symbol nicht neu erstellen, wenn dasselbe Fragment ein zweites Mal eingegeben wird. Lassen Sie dies einfach hier, wenn andere ebenfalls auf dieses Problem stoßen.Antworten:
Sie haben geschrieben, dass Sie zum Implementieren von Fragmenten niedrigerer Ebene das vorhandene Fragment ersetzen, anstatt das Fragment niedrigerer Ebene in einer neuen Aktivität zu implementieren.
Ich würde denken, dass Sie dann die Zurück-Funktionalität manuell implementieren müssten: Wenn der Benutzer zurückgedrückt hat, haben Sie Code, der den Stapel öffnet (z
Activity::onBackPressed
. B. beim Überschreiben). Wo immer Sie das tun, können Sie das umkehrensetDrawerIndicatorEnabled
.quelle
Es ist so einfach wie 1-2-3.
Wenn Sie erreichen wollen:
1) Schubladenanzeige - wenn sich keine Fragmente im hinteren Stapel befinden oder die Schublade geöffnet ist
2) Pfeil - wenn sich einige Fragmente im hinteren Stapel befinden
3) Beide Indikatoren müssen entsprechend ihrer Form wirken
PS Siehe Weitere Tipps zum Verhalten der dreizeiligen Anzeige finden Erstellen einer Navigationsleiste für Android-Entwickler .
quelle
setActionBarArrowDependingOnFragmentsBackStack()
... was für ein langer Name: PIch habe als nächstes verwendet:
quelle
drawerToggle.setToolbarNavigationClickListener(
dieser Listener aufgerufen, wenn auf den PfeilWenn die Schaltfläche in der Aktionsleiste nicht funktioniert, vergessen Sie nicht, den Listener hinzuzufügen:
Ich habe einige Probleme beim Implementieren einer Schubladennavigation mit einer Home-Taste. Bis auf den Aktionsknopf hat alles funktioniert.
quelle
Versuchen Sie, die Auswahl des Home-Elements in der MainActivity abhängig vom Status des DrawerToggle zu behandeln. Auf diese Weise müssen Sie nicht jedem Fragment denselben Code hinzufügen.
quelle
onBackPressed()
weil ich für beide das gleiche Verhalten wollte.NACHVERFOLGEN
Die von @dzeikei angegebene Lösung ist ordentlich, kann jedoch bei Verwendung von Fragmenten erweitert werden, um das Zurücksetzen der Schubladenanzeige bei leerem Backstack automatisch zu handhaben.
BEARBEITEN
Für die Frage von @JJD.
Die Fragmente werden in einer Aktivität gehalten / verwaltet. Der obige Code wird einmal in dieser Aktivität geschrieben, behandelt aber nur das Up Caret für das
onOptionsItemSelected
.In einer meiner Apps musste ich auch das Verhalten des Up Caret behandeln, wenn die Zurück-Taste gedrückt wurde. Dies kann durch Überschreiben behandelt werden
onBackPressed
.Beachten Sie die Codeduplizierung zwischen
onOptionsItemSelected
und,onBackPressed
die vermieden werden kann, indem Sie eine Methode erstellen und diese Methode an beiden Stellen aufrufen.Beachten Sie auch, dass ich zwei weitere Male hinzufüge,
executePendingTransactions
was in meinem Fall erforderlich war, oder dass ich manchmal seltsame Verhaltensweisen des Up Caret hatte.quelle
mDrawerToggle
innerhalb einerNavigationDrawerFragment
Klasse. Damit es funktioniert, muss ich auch den Status der Home-Taste / Anzeige umschalten - siehe :NavigationDrawerFragment#toggleDrawerIndicator
. Außerdem bin ich mir nicht sicher, ob Sie den ersten Check-in benötigenonOptionsItemSelected
: Ich habe ihn auskommentiert. - Vereinfachtes BeispielonOptionsItemSelected
. Dadurch wird sichergestellt, dass die Navigationsleiste weiterhin in der Hierarchie der obersten Ebene geöffnet wird. Ich habe den Code jedoch in die verschobenNavigationDrawerFragment#onOptionsItemSelected
. Das hilft mir , nicht zu belichten ,mDrawerToggle
um dieMainActivity
.Ich habe eine Schnittstelle für die Hosting-Aktivität erstellt, um den Ansichtsstatus des Hamburger-Menüs zu aktualisieren. Für Fragmente der obersten Ebene setze ich den Umschalter auf
true
und für Fragmente, für die ich den Aufwärtspfeil anzeigen möchte, auf den ich den Umschalter eingestellt habefalse
.Dann in meiner Tätigkeit ...
quelle
Diese Antwort funktionierte, aber es gab ein kleines Problem damit. Das
getSupportActionBar().setDisplayHomeAsUpEnabled(false)
wurde nicht explizit aufgerufen und führte dazu, dass das Schubladensymbol ausgeblendet wurde, selbst wenn sich keine Elemente im Backstack befanden. Daher funktionierte das Ändern dersetActionBarArrowDependingOnFragmentsBackStack()
Methode für mich.quelle
Die Logik ist klar. Schaltfläche Zurück anzeigen, wenn der Fragmentstapel gelöscht ist. Zeigen Sie eine Material-Hamburger-Back-Animation an, wenn der Fragmentstapel nicht klar ist.
quelle
Wenn Sie sich die GMAIL-App ansehen und hierher kommen, um nach dem Carret- / Erschwinglichkeitssymbol zu suchen.
Ich würde Sie bitten, dies zu tun, keine der obigen Antworten war klar. Ich konnte die akzeptierte Antwort ändern.
NavigationDrawer -> Listview enthält Unterfragmente.
Unterfragmente werden so aufgelistet
firstFragment == position 0 ---> dies hat Unterfragmente -> Fragment
In firstFragment haben Sie ein anderes Fragment.
Rufen Sie dies bei DrawerActivity auf
und in Fragment
Setzen Sie bei der Aktivitätsmethode OnBackPressed Drawer den Drawer-Schalter auf true, um das Navigationslistensymbol wieder zu aktivieren.
Danke, Pusp
quelle
Sie können sich dieses kleine Beispiel ansehen! https://github.com/oskarko/NavDrawerExample
quelle
IMO ist die Verwendung von onNavigateUp () (wie hier gezeigt ) in der Lösung von riwnodennyk oder Tom sauberer und scheint besser zu funktionieren. Ersetzen Sie einfach den onOptionsItemSelected-Code durch diesen:
quelle