У меня такая простая проблема:
Действие содержит фрагмент. Оба хотят общаться друг с другом.
Фрагмент хочет сообщить активности об определенных взаимодействиях. Поэтому он определяет интерфейс OnFragmentInteractionListener, который реализуется действием. Это уже часть шаблона фрагмента Android Studio, поэтому здесь нет ничего нового.
Действие хочет сообщить фрагменту о нажатой кнопке возврата. Следовательно, он определяет интерфейс OnBackPressedListener, который реализуется фрагментом.
class MainActivity extends AppCompatActivity implements MyFragment.OnFragmentInteractionListener {
...
@Override
public void onFragmentInteraction(Uri uri) {
...
}
interface OnBackPressedListener {
boolean onBackPressed();
}
}
class MyFragment extends Fragment implements MainActivity.OnBackPressedListener {
...
@Override
public boolean onBackPressed() {
...
}
interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
}
ИМХО простой дизайн, который, к сожалению, не работает. «Циклическое наследование с участием ...» - это сообщение от Android Studio.
Я ожидал бы этой ошибки компиляции, если бы использовал вложенные классы вместо интерфейсов, поскольку статические инициализаторы классов могли бы циклически зависеть друг от друга. Я не вижу такой проблемы с интерфейсами, но уверен, что есть веская причина, по которой это запрещено.
Самый простой способ решить эту проблему - сделать один из интерфейсов интерфейсом уровня пакета. Но мне интересно, можно ли это сделать. И если да: какой из них должен быть на уровне пакета.




Вы можете подключить BroadcastListener к фрагменту с помощью вызова регистра.
Не забудьте отменить регистрацию слушателя в onStop или onPause, если вы планируете взаимодействовать с пользовательским интерфейсом, иначе это вызовет исключения.
Теперь простой способ - переопределить onBackPressed внутри вашей активности и, когда она будет достигнута, транслировать событие и сообщить вашему фрагменту. Просто и не должно быть слишком проблематичным в обращении.
Я лично предпочитаю этот подход для отправки сообщений всем моим фрагментам. Другой подход, как вы сами сказали, - это объявление интерфейса всего пакета и выполнение того, что вы хотели, как вы уже написали. В этом тоже нет ничего плохого, просто Java - это Java.
Определите интерфейс активности
OnBackPressedListenerв другом файле.