У меня есть один 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
}
}
Таким образом, когда вы реализуете интерфейс в зависимости от потребностей вашего приложения, возможно, вы можете повторно использовать этот интерфейс в другой ситуации.