Немного неудобно, но решил следующим образом. Во-первых, я перенёс логику метода
onCreateOptionsMenu в сами фрагменты, чтобы не делать кучу проверок в Activity на то, какой фрагмент в данный момент находится в контейнере. Во-вторых, в фрагментах я сохраняю ссылку на
SearchView и удаляю все слушатели самостоятельно:
private SearchView mActionSearch;
private void disposeActions() {
if (mActionSearch != null) {
mActionSearch.setOnQueryTextListener(null);
mActionSearch.setOnCloseListener(null);
}
mActionSearch = null;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
disposeActions();
inflater.inflate(R.menu.menu_main_players, menu);
mActionSearch = (SearchView) menu.findItem(R.id.action_search).getActionView();
mActionSearch.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
loadData(false);
return false;
}
});
// ...
}
@Override
public void onDetach() {
super.onDetach();
disposeActions();
}
Возможно кому-то окажется полезным.