Gibt es eine Möglichkeit, in der wir "onBackPressed()" in Android Fragment ähnlich wie in der Art und Weise implementieren können, in der wir in Android Activity?
Da der Fragment-Lebenszyklus nicht onBackPressed()
hat. Gibt es eine andere alternative Methode, um "onBackPressed()" in Android 3.0-Fragmenten zu überbrücken?
Nach @HaMMeRed Antwort ist hier Pseudocode, wie es funktionieren sollte.
Nehmen wir an, dass Ihre Hauptaktivität BaseActivity
heißt, die untergeordnete Fragmente hat (wie im Beispiel der SlidingMenu Lib).
Hier sind die Schritte:
Zuerst müssen wir eine Schnittstelle und eine Klasse erstellen, die ihre Schnittstelle implementiert, um eine generische Methode zu haben
Erstellen Sie die Klassenschnittstelle "OnBackPressedListener".
öffentliche Schnittstelle OnBackPressedListener {
public void doBack();
}
Erstellen Sie eine Klasse, die die Fähigkeiten von "OnBackPressedListener" implementiert
public class BaseBackPressedListener implements OnBackPressedListener {
private final FragmentActivity activity;
public BaseBackPressedListener(FragmentActivity activity) {
this.activity = activity;
}
@Override
public void doBack() {
activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
Ab jetzt werden wir an unserem Code BaseActivity
und seinen Fragmenten arbeiten
Erstellen Sie einen privaten Listener über Ihrer Klasse BaseActivity
.
protected OnBackPressedListener onBackPressedListener;
Erstellen Sie eine Methode zum Setzen des Listeners in BaseActivity
.
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
in override onBackPressed
etwas wie das implementieren
@Override
public void onBackPressed() {
if (onBackPressedListener != null)
onBackPressedListener.doBack();
sonst
super.onBackPressed();
in Ihrem Fragment in onCreateView
sollten Sie unseren Listener hinzufügen
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
activity = getActivity();
((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));
View view = ... ;
//Zeug mit view
view zurückgeben;
}
Voila, jetzt, wenn Sie zurück in Fragment klicken, sollten Sie Ihre benutzerdefinierte auf zurück Methode zu fangen.
Wenn Sie diese Art von Funktionalität wünschen, müssen Sie sie in Ihrer Aktivität außer Kraft setzen und dann eine Schnittstelle "YourBackPressed" zu all Ihren Fragmenten hinzufügen, die Sie auf dem entsprechenden Fragment aufrufen, wenn die Schaltfläche "Zurück" gedrückt wird.
Edit: Ich möchte meine vorherige Antwort ergänzen.
Wenn ich das heute machen würde, würde ich einen Broadcast verwenden, oder möglicherweise einen geordneten Broadcast, wenn ich erwarte, dass andere Panels im Einklang mit dem Master/Hauptinhaltspanel aktualisiert werden.
LocalBroadcastManager
in der Support Library kann dabei helfen, und man sendet den Broadcast einfach in onBackPressed
und abonniert die Fragmente, die es interessiert. Ich denke, dass Messaging eine besser entkoppelte Implementierung ist und besser skalieren würde, daher wäre das jetzt meine offizielle Empfehlung für die Implementierung. Verwenden Sie einfach die Intent
's Aktion als Filter für Ihre Nachricht. senden Sie Ihre neu erstellte ACTION_BACK_PRESSED
, senden Sie es von Ihrer Aktivität und hören Sie es in den relevanten Fragmenten.
Fügen Sie einfach addToBackStack
hinzu, während Sie zwischen Ihren Fragmenten wie unten beschrieben wechseln:
fragmentManager.beginTransaction().replace(R.id.content_frame,fragment).addToBackStack("tag").commit();
Wenn Sie addToBackStack(null)
schreiben, wird es von selbst behandelt, aber wenn Sie ein Tag angeben, sollten Sie es manuell behandeln.