У меня была такая же проблема, и я создал для нее новый слушатель и использовал его в своих фрагментах.
1 - в вашей активности должен быть интерфейс слушателя и список слушателей
2 - Вы должны реализовать методы для добавления и удаления слушателей
3 - Вы должны переопределить метод onBackPressed, чтобы проверить, использует ли кто-либо из слушателей нажатие сзади или нет
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 -Ваш фрагмент должен реализовывать интерфейс для обратного нажатия
5 - Вам необходимо добавить фрагмент в качестве прослушивателя для обратного нажатия
6 - Вы должны вернуть true из onBackPressed, если фрагмент использует это обратное нажатие
7 - ВАЖНО - Вы должны удалить фрагмент из списка на Дестрой
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;
}
}
Вместо ArrayList используется стек, чтобы можно было начинать с последнего фрагмента.Также может возникнуть проблема при добавлении фрагментов в задний стек.Таким образом, вы должны проверить, что фрагмент виден или нет при использовании обратного нажатия.В противном случае один из фрагментов будет использовать событие, и последний фрагмент не будет закрыт при обратном нажатии.
Надеюсь, это решит проблему для всех.