Ich hatte das gleiche Problem, und ich habe einen neuen Hörer dafür erstellt und in meinen Fragmenten verwendet.
1 - Ihre Aktivität sollte eine Zuhörerschnittstelle und eine Liste von Zuhörern enthalten
2 - Sie sollten Methoden zum Hinzufügen und Entfernen der Zuhörer implementieren
3 - Sie sollten die onBackPressed-Methode überschreiben, um zu prüfen, ob einer der Zuhörer die Rückwärts-Taste verwendet oder nicht
public class MainActivity ... {
/**
* Back press listener list. Used for notifying fragments when onBackPressed called
*/
private Stack<BackPressListener> backPressListeners = new Stack<BackPressListener>();
...
/**
* Adding new listener to back press listener stack
* @param backPressListener
*/
public void addBackPressListener(BackPressListener backPressListener) {
backPressListeners.add(backPressListener);
}
/**
* Removing the listener from back press listener stack
* @param backPressListener
*/
public void removeBackPressListener(BackPressListener backPressListener) {
backPressListeners.remove(backPressListener);
}
// Overriding onBackPressed to check that is there any listener using this back press
@Override
public void onBackPressed() {
// checks if is there any back press listeners use this press
for(BackPressListener backPressListener : backPressListeners) {
if(backPressListener.onBackPressed()) return;
}
// if not returns in the loop, calls super onBackPressed
super.onBackPressed();
}
}
4 - Ihr Fragment muss die Schnittstelle für Backpress implementieren
5 - Sie müssen das Fragment als Hörer für Backpress hinzufügen
6 - Sie sollten true von onBackPressed zurückgeben, wenn das Fragment dieses Backpress verwendet
7 - WICHTIG - Sie müssen das Fragment aus der Liste onDestroy entfernen
public class MyFragment extends Fragment implements MainActivity.BackPressListener {
...
@Override
public void onAttach(Activity activity) {
super.onCreate(savedInstanceState);
// adding the fragment to listener list
((MainActivity) activity).addBackPressListener(this);
}
...
@Override
public void onDestroy() {
super.onDestroy();
// removing the fragment from the listener list
((MainActivity) getActivity()).removeBackPressListener(this);
}
...
@Override
public boolean onBackPressed() {
// you should check that if this fragment is the currently used fragment or not
// if this fragment is not used at the moment you should return false
if(!isThisFragmentVisibleAtTheMoment) return false;
if (isThisFragmentUsingBackPress) {
// do what you need to do
return true;
}
return false;
}
}
Anstelle der ArrayList wird ein Stack verwendet, um mit dem letzten Fragment beginnen zu können. Es kann auch ein Problem beim Hinzufügen von Fragmenten zum Stapel geben. Sie müssen also prüfen, ob das Fragment sichtbar ist oder nicht, während Sie back press verwenden. Andernfalls wird eines der Fragmente das Ereignis nutzen und das letzte Fragment wird beim Zurückdrücken nicht geschlossen.
Ich hoffe, damit ist das Problem für alle gelöst.