Как правильно обрабатывать несколько слушателей взаимодействия фрагментов в одном действии?

К нему прикреплены один Activity и шесть разных Fragments. Каждый фрагмент имеет OnFragmentInteractionListener интерфейс, и действие реализует всех этих слушателей для получения обратных вызовов. Это выглядит немного беспорядочно, поэтому мне интересно, есть ли какие-то шаблоны / способы упростить это и сделать более элегантным?


person MainstreamDeveloper00    schedule 10.06.2015    source источник


Ответы (2)


Хорошим решением может быть использование ОДНОГО OnFragmentInteractionListener для всех фрагментов и использования одного параметра каждого метода прослушивателя (например, параметра TAG) для определения того, какой фрагмент отправил действие.

Вот пример:

Создайте новый класс, и каждый фрагмент использует этот класс

OnFragmentInteractionListener.java

public interface OnFragmentInteractionListener {
    public void onFragmentMessage(String TAG, Object data);
}

В вашей деятельности:

public void onFragmentMessage(String TAG, Object data){
    if (TAG.equals("TAGFragment1")){
        //Do something with 'data' that comes from fragment1
    }
    else if (TAG.equals("TAGFragment2")){
        //Do something with 'data' that comes from fragment2
    }
    ... 
} 

Вы можете использовать тип объекта для передачи любого типа данных, который вы хотите (тогда, в каждом случае, вы должны преобразовать объект в тип, который был необходим).

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

Надеюсь это поможет.

person Neonamu    schedule 10.06.2015

Моя попытка улучшить ответ neonamu:

Вы можете определить интерфейс, как указано выше, но общий

public interface OnListFragmentInteractionListener<T> {

      void onListFragmentInteraction(String tag, T data);
}

Затем в действии хоста вы можете реализовать его специально для нужного вам типа или как предложено выше для объекта:

public class MyFragActivity implements OnListFragmentInteractionListener<Object> {
    ...

    @Override
    public void onListFragmentInteraction(String tag, Object data) {
          //do some stuff with the data
    }
}

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

person HenriqueMS    schedule 29.03.2016
comment
Работает как шарм. Большое спасибо! - person B.K.; 10.05.2017
comment
Мне было интересно, почему вы используете @Override, а пользователь Neonamu - нет. Оба работают? - person Burkely91; 01.08.2017
comment
@ Burkely91 да, он будет работать и без него, но вы должны его использовать. аннотация переопределения в Java предназначена для проверки / подтверждения того, что вы действительно выполняете переопределение, которое, как вы думаете, вы делаете (он сообщит об ошибке, если вы забудете параметр, например) без переопределения, вы просто определяете новый метод с тем же именем разные параметры (выполняя перегрузку) и не реализуя интерфейс - person HenriqueMS; 01.08.2017