guevara
@guevara
Comandante

Как сделать одну модель данных для нескольких фрагментов android?

Есть модель в виде большого нетривиального объекта с кучей полей. В Activity несколько фрагментов должны работать с этим объектом. Очень похоже на паттерн Observer. Везде дают советы использовать для передачи данных фрагментам через API функцию fragment.setArguments(bundle). Но я не понимаю, зачем копировать данные и тратить память. Чем плох подход, когда мы просто создадим модель в Activity и передадим в конструкторе каждому фрагменту ссылку на эту модель?
  • Вопрос задан
  • 797 просмотров
Решения вопроса 1
@FoxInSox
Тем, что система может убить фрагмент и пересоздать его. Само собой в конструктор система ничего передаст.

Модель по хорошему не должна храниться в оперативной памяти, а должна например храниться в БД. Как обновлять и загружать данные из БД зависит от вас.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Copperfield
Android dude
Посмотрите в строну MV* паттернов. Например, MVP.
Ответ написан
aratj
@aratj
программер.
а если посмотреть реализацию менеджера фрагментов ?
то увидишь, что при восстановление состояния, он будет дергать пустой конструктор, именно по этому смысла нет , добавлять в фрагменты свой конструктор с параметрами.
либо будет ошибка, либо ничего.

у меня вообще бывало нет моделей. просто обсерверы на БД , что то поменялось в БД, меняется и в других фрагментах.
Ответ написан
Комментировать
@dchuvasov
Если у вас одна активити или данные необходимо передовать только внутри этой активити, то можно использовать такой трюк:
1) создаем модель
2) создаем пустой фрагмент в конструкторе создаем модель, а в onCreate вызываете метод setRetainInstance(true);(это защитить фрагмент от уничтожения и пересоздания)
public class SignInWorkerFragment extends Fragment {
	private final SignInModel mSignInModel;

	public SignInWorkerFragment() {
		mSignInModel = new SignInModel();
	}

	@Override
	public void onCreate(final Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setRetainInstance(true);
	}

	public SignInModel getSignInModel() {
		return mSignInModel;
	}
}

3) этот фрагмент запихиваем в фрагментменеджер и выставляем ему тег, чтобы потом можно было его выципить и получить ссылку на нашу модель
final SignInWorkerFragment retainedWorkerFragment =
				(SignInWorkerFragment) getFragmentManager().findFragmentByTag(TAG_WORKER);

		if (retainedWorkerFragment != null) {
			mSignInModel = retainedWorkerFragment.getSignInModel();
		} else {
			final SignInWorkerFragment workerFragment = new SignInWorkerFragment();

			getFragmentManager().beginTransaction()
					.add(workerFragment, TAG_WORKER)
					.commit();

			mSignInModel = workerFragment.getSignInModel();
		}


Весь проект здесь
А рассказ про все это дело и не только, в курсе онлайн-школы от e-Legion: ссылка на видео
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы