10

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

ответ

17

Хорошим решением может быть использование ТОЛЬКО 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 
    } 
    ... 
} 

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

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

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

5

Моя попытка улучшения neonamu's answer:

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

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 
    } 
} 

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

+1

Работает как очарование. Большое спасибо! –

+0

Мне было интересно, почему вы используете @Override и пользователь Neonamu этого не делает. Оба работают? – Burkely91

+1

@ Burkely91 да он будет работать без него.BUT Вы должны использовать его. аннотация переопределения в Java предназначена для проверки/проверки, что вы фактически выполняете переопределение, которое, по вашему мнению, вы (оно сообщит об ошибке, если вы забудете параметр, например) без переопределения, вы просто определяете новый метод с тем же именем разные параметры (выполнение перегрузки) и не реализация интерфейса – HenriqueMS

Смежные вопросы