Как сохранить состояния фрагментов, чтобы избежать их повторного создания

Я реализовал что-то вроде рисунка ниже:

введите здесь описание изображения

У меня есть несколько вкладок, и каждая вкладка может иметь несколько кнопок, которые загружают разные фрагменты. В этом случае на вкладке 1 кнопка 1 загружает фрагмент 1, а кнопка 2 загружает фрагмент 2 и каждый раз Фрагменты будут создаваться заново. но я хочу, чтобы кнопки загружали фрагменты только один раз и не создавали их в следующий раз.

Текущая Кнопка 1 onClick:

FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container_root, FragmentOne.newInstance(),"Frag1");
transaction.commit();

Как я могу сохранить состояния фрагментов, чтобы избежать перезагрузки каждый раз?


РЕДАКТИРОВАТЬ

Фрагменты Tab 1 и Tab 2 находятся внутри ViewPager, поэтому я не мог использовать ViewPager для Fragment 1 и Fragment 2. >.


person Alireza Noorali    schedule 20.05.2019    source источник
comment
вы можете создать пейджер без вкладок   -  person Aravind V    schedule 20.05.2019
comment
на сайте thecheesefactory.com/blog/   -  person Niki    schedule 20.05.2019
comment
@AravindV корневой фрагмент, содержащий кнопки 1 и 2, находится внутри ViewPager. Я не хочу реализовывать ViewPager внутри другого ViewPager.   -  person Alireza Noorali    schedule 20.05.2019


Ответы (2)


Используйте приведенный ниже код

FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.add(R.id.container_root, FragmentOne.newInstance(),"Frag1");
transaction.addToBackStack("Frag1");
transaction.commit();

вместо

FragmentTransaction transaction = 
getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container_root, FragmentOne.newInstance(),"Frag1");
transaction.commit();

Проблема:

Вы пытаетесь заменить фрагмент при добавлении через FragmentTransaction. Если вам нужно сохранить их экземпляры, вам нужно использовать метод transaction.add.

Осторожность:

С помощью этого метода можно перекрывать фрагменты. Поэтому вам нужно добавить фоновый цвет к обоим фрагментам и сделать родительский макет кликабельным, чтобы вы могли взаимодействовать

person Rahul Khurana    schedule 20.05.2019

вы можете создавать свои вкладки с помощью viewpager

ViewPager pager = (ViewPager) findViewById(R.id.viewPager);
pager.setOffscreenPageLimit(tabsNumber - 1); // e.g. send 2 as parameter for 3 tabs

и сохраните состояние вкладки

person Poorya Taghizade    schedule 20.05.2019
comment
Я использовал ViewPager для реализации своих вкладок, но корневой фрагмент, содержащий кнопку 1 и кнопку 2, находится внутри ViewPager. Я не хочу реализовывать ViewPager внутри другого ViewPager. - person Alireza Noorali; 20.05.2019
comment
когда вы используете страницу просмотра пейджера, ваша вкладка не пересоздается, поэтому фрагмент, который присутствовал на вкладке 2, остается присутствующим - person Poorya Taghizade; 20.05.2019
comment
Я думаю, вы не уделили должного внимания фотографии, которую я поделился. Два разных фрагмента внутри Tab 1 создавали проблему. - person Alireza Noorali; 20.05.2019