Лучший способ разрешить циклическую зависимость между Activity и Fragment

У меня такая простая проблема:

Действие содержит фрагмент. Оба хотят общаться друг с другом.

Фрагмент хочет сообщить активности об определенных взаимодействиях. Поэтому он определяет интерфейс 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.

Я ожидал бы этой ошибки компиляции, если бы использовал вложенные классы вместо интерфейсов, поскольку статические инициализаторы классов могли бы циклически зависеть друг от друга. Я не вижу такой проблемы с интерфейсами, но уверен, что есть веская причина, по которой это запрещено.

Самый простой способ решить эту проблему - сделать один из интерфейсов интерфейсом уровня пакета. Но мне интересно, можно ли это сделать. И если да: какой из них должен быть на уровне пакета.

Определите интерфейс активности OnBackPressedListener в другом файле.

leonardkraemer 04.04.2018 14:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
627
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете подключить BroadcastListener к фрагменту с помощью вызова регистра.

Не забудьте отменить регистрацию слушателя в onStop или onPause, если вы планируете взаимодействовать с пользовательским интерфейсом, иначе это вызовет исключения.

Теперь простой способ - переопределить onBackPressed внутри вашей активности и, когда она будет достигнута, транслировать событие и сообщить вашему фрагменту. Просто и не должно быть слишком проблематичным в обращении.

Я лично предпочитаю этот подход для отправки сообщений всем моим фрагментам. Другой подход, как вы сами сказали, - это объявление интерфейса всего пакета и выполнение того, что вы хотели, как вы уже написали. В этом тоже нет ничего плохого, просто Java - это Java.

Другие вопросы по теме