13

Ich benutze diese Vorlage https://github.com/kanytu/android-material-drawer-template nur um material design auszuprobieren, also habe ich ein paar Fragmente implementiert einige haben Webviews einige nicht.ActionBarActivity zurück Button nicht aus backstack

Mein Problem ist, wenn zwischen den Fragmenten Schalt ich sehen kann, sie erfolgreich in die Backstack hinzugefügt werden

getFragmentManager().beginTransaction().replace(R.id.container, new FAQ()).addToBackStack("FAQ").commit(); 

Aber wenn ich die Zurück-Taste drücken Sie schließt nur die App.

Wenn ich es ändern, um Activity statt ActionBarActivity zu verwenden, funktioniert die Navigation gut, aber ich verliere etwas andere Funktionalität.

Es gibt eine Überschreibung auf der Rückseite Taste

@Override 
public void onBackPressed() { 
    if (mNavigationDrawerFragment.isDrawerOpen()) 
     mNavigationDrawerFragment.closeDrawer(); 
    else 
     super.onBackPressed(); 
} 

aber auch wenn das Löschungen geschieht es immer noch. Ich denke, das Problem liegt irgendwo in der super.onBackPressed

Gibt es einen Grund ActionBarActivity würde die Schaltfläche zurück brechen?

Antwort

21

Ich habe vor kurzem einen Beitrag darüber gelesen, sorry, ich kann es nicht mehr finden ... Aber im Grunde erklärt es, dass die primäre Funktion der Zurück-Taste ist, um die aktuelle Activity zu beenden.

In der Tat, nach the onBackPressed() official documentation:

aufgerufen, wenn die Aktivität des Benutzers Drücken der Zurück-Taste festgestellt hat. Die Standardimplementierung beendet einfach die aktuelle Aktivität,, aber Sie können dies überschreiben, um zu tun, was Sie wollen.

Und es scheint, dass, auch wenn die Taste wieder verwendet, um die Backstack vor 5,0 bis Pop, würde Google dieses Verhalten mit den neuen ActionBarActivity geändert hat.

Für meinen Teil habe ich einige Workarounds verwendet, die für mich funktionieren, aber das funktioniert möglicherweise nicht für jeden, abhängig von Ihrer Navigationsimplementierung.

Aber im Fall könnte es jemand nützlich sein, hier ist es:

@Override 
public void onBackPressed() 
{ 
    if (mDrawerLayout.isDrawerOpen()) { 
     mDrawerLayout.closeDrawer(); 
    } else if (getFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Auf diese Weise wird ActionBarActivity.onBackPressed() nur aufgerufen, wenn der Backstack leer ist, in welchem ​​Fall sie die ActionBarActivity zerstört.

+1

Dies ist etwas frustrierendes Verhalten! Zumindest fühle ich es so. Es gibt keine Dokumentation über ein anderes Verhalten von ActionBarActivity im Vergleich zu Activity, und es sollte keine grundlegenden Elemente wie onBackPressed geben, oder? Wie sollten die Entwickler über diese Art von Dingen Bescheid wissen, außer dass sie stundenlange Ermittlungen auf nicht-offiziellen androiden Seiten/Blogs/Posts usw. vornehmen ...: -/@MathieuMaree Wenn Sie den Artikel finden könnten, über den Sie schreiben, wäre das grandios! – degill

+0

@degill Ich habe gerade die Antwort aktualisiert, habe den Beitrag nicht gefunden, aber ich habe ihn wahrscheinlich in der offiziellen Dokumentation gefunden. Ich stimme zu, es ist komisch, aber ich denke, das vorherige Verhalten war ein "Fehler" und sie beschlossen, es in der "ActionBarActivity" zu beheben (ich vermute nur). – MathieuMaree

+1

Lustige Sache ist, dass die tatsächliche Implementierung von onBackPressed in Activity tatsächlich den Backstack öffnet, während die Implementierung in ActionBarActivity die Aktivität beendet, aber die offizielle Dokumentation das Gegenteil besagt http://developer.android.com/reference/android/support/v7/ app/ActionBarActivity.html # onBackPressed() – degill

1

Sie sollten "getFragmentManager" überprüfen & "getSupportFragmentManager" entspricht Ihrer Aktivität & actionbaractivity oder nicht.

Denn in Aktivität:

public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

in FragmentActivity:

public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

Wir können den gleichen Code sehen, die bereits backstatck Pop-Fragmenten behandelt. In meiner Situation habe ich actionbaractivity (erweitert FragmentActivity) verwendet, aber ich habe auch "getFragmentManager" verwendet, also habe ich den gleichen Fehler wie Sie. Nachdem ich "getFragmentManager" durch "getSupportFragmentManager" ersetzt habe, ist das in Ordnung! Sie können auch "actionbaractiviy" zu "Activity" ersetzen, um dieses Problem zu beheben.

Muss sicherstellen, "getFragmentManager" übereinstimmen "Aktivität", "getSupportFragmentManager" übereinstimmen "FragmentActivity (ActionbarActivity)".

Wenn Sie auf API-Ebene hinzufügen ActionBar wollen 11 oder höher, können Sie unten sehen:

https://developer.android.com/guide/topics/ui/actionbar.html#Adding

auf API-Ebene 11 oder höher In der Aktionsleiste ist in allen Aktivitäten enthalten, die verwenden das Theme.Holo-Theme (oder eines seiner Nachkommen), das das Standardthema ist, wenn das targetSdkVersion- oder das minSdkVersion-Attribut auf "11" oder höher festgelegt ist. Wenn Sie die Aktionsleiste für eine Aktivität nicht möchten, legen Sie das Aktivitätsthema auf Theme.Holo.NoActionBar fest.

Verwandte Themen