mitaichik
@mitaichik

Как корректно восстанавливать фрагмент в фрагменте?

Добрый день.
Еще не сталкивался с работой фрагмента в фрагменте, подскажите как правильно восстанавливать их состояние?

Есть активити Activity
В нее устанавливается фрагмент FragmentA.
В FragmentA устанавливается FragmentB.

В коде это выглядит примерно так:

// активити
public void onCreate(Bundle savedInstanceState)
{
	super.onCreate(R.layout.activity, savedInstanceState);
	Fragment fragment = FragmentA.newInstance(....);
	setFragment(R.id.container, fragment); // установка с помощью FragmentManager
}

// FragmentA

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
	{
		View layout = createView(R.layout.fragment_a, inflater);
		Fragment fragment = FragmentB.newInstance(...);
		setFragment(R.id.container_sub, fragment);
		return layout;
	}

// в FragmentB ничего какого-то интересного кода нет


Проблема - при пересоздании активити пересоздаются фрагменты (теряется состояние), а нужно чтоб они восстанавливались.

С активит выход такой - обернуть создание фрагмента в проверку на savedInstanceState:

// активити
public void onCreate(Bundle savedInstanceState)
{
	super.onCreate(R.layout.activity, savedInstanceState);

	if (savedInstanceState == null) {
		Fragment fragment = FragmentA.newInstance(....);
		setFragment(R.id.container, fragment); 
	}
}


Корректно ли для восстановления фрагмента во фрагменте сделать то же самое, то есть в FragmentA сделать что то типа

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
	View layout = createView(R.layout.fragment_a, inflater);
	if (savedInstanceState == null) {
		Fragment fragment = FragmentB.newInstance(...);
		setFragment(R.id.container_sub, fragment);
	}
	return layout;
}


На первый взгляд вроде работает как надо, но правильно ли так делать?
Может подскажете хорошую статью или книгу где подробно описано как работает все эти фрагменты и FragmentManager - везде где я видел это описано как-то поверхностно....
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Не очень понятно, что за метод setFragment. Чтобы этот код работал правильно внутри фрагмента надо использовать getChildFragmentManager. Тогда всё будет ок.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы