Передача объекта класса из одного Fragment в другой
У меня есть два Fragmenta sollveClasssFragment и History_fargment в tabitem каждый. Я хочу передать объект класса History history, который является Serializable.
В sollveClasssFragment я применяю следующий код в методе onCreateView :
FragmentTransaction ft = Objects.requireNonNull(getActivity()).getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
History_fargment history_fragment = new History_fargment();
Bundle bundle = new Bundle();
History history;
history = new History(repl,hdif,dTarg,xT,yT);
bundle.putSerializable("history", history);
history_fragment.setArguments(bundle);
ft.replace(android.R.id.content, history_fragment);
ft.addToBackStack(null);
ft.commit();
В History_fargment я принимаю объект класса в методе onCreate:
Bundle bundle = getArguments();
assert bundle != null;
History history;
history = (History) bundle.getSerializable("history");
lstHistory.add(history);
super.onCreate(savedInstanceState);
Но при запуске sollveClasssFragment появляется ошибка
java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.Serializable android.os.Bundle.getSerializable(java.lang.String)' on a null object reference
в строке History_fargment
history = (History) bundle.getSerializable("history")
Помогите советом пожалуйста.
Ответы (1 шт):
Передача объектов между фрагментами не должна происходить напрямую! Фрагменты должны быть независимы друг от друга, а это означает что фрагмент "А" ничего не должен знать о фрагменте "Б", а тем более туда что-то передавать.
Все взаимодействие между фрагментами должно проходить через активити в которой они лежат. А фрагменты должны сообщать активити о происходящих событиях через интерфейс. Например: Пользователь кликнул во фрагменте "А" на кнопку "Открыть фрагмент Б". Фрагмент "А" через интерфейс сообщает активити, что произошло событие "Нажатие на кнопку", а активити решает сама что с этим делать.
Что вы получите таким путем? Ваши фрагменты будут переиспользуемы, вы можете например на телефоне иметь 2 фрагмента на 2 экрана, а на планшете 2 фрагмента на одном экране (например почтовое приложение: Фрагмент "А" список писем, фрагмент "Б" детали письма). Так же такое взаимодействие намного легче поддерживать при росте приложения.
Теперь второй вопрос: Как передать?
Передавать через интенты большие объекты не является хорошей практикой, ко всему тому еще и размер бандла ограничен. Чтоб решить эту проблему вам хорошо бы создать сущность которая живет отдельно от фрагмента. Это может быть база данных или просто какой-то синглтон который живет отдельно от фрагментов, а в бандл класть только id (или другой опозновательный параметр, но простой), а при входе на новый фрагмент дергать по id нужный вам объект.