К нему прикреплены один Activity
и шесть разных Fragments
. Каждый фрагмент имеет OnFragmentInteractionListener
интерфейс, и действие реализует всех этих слушателей для получения обратных вызовов. Это выглядит немного беспорядочно, поэтому мне интересно, есть ли какие-то шаблоны / способы упростить это и сделать более элегантным?
Как правильно обрабатывать несколько слушателей взаимодействия фрагментов в одном действии?
Ответы (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 разных слушателей и метод для каждого типа данных, которые вы хотите передать.
Надеюсь это поможет.
Моя попытка улучшить ответ 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
}
}
Таким образом, когда вы реализуете интерфейс в зависимости от потребностей вашего приложения, возможно, вы сможете повторно использовать этот интерфейс в другой ситуации.