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

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

Ответ 1

Хорошим решением может быть использование SAME 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 разных слушателей и метод для каждого типа данных, которые вы хотите передать.

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

Ответ 2

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

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

public interface OnListFragmentInteractionListener<T> {

      void onListFragmentInteraction(String tag, T data);
}

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

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

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

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