Вдруг вам надо листать фрагменты через ViewPager2 и при этом подменять их динамически. Например, чтобы уйти "глубже" - пользователь из фрагмента "Главные настройки" переходит во фрагмент "Выбор языка". При этом новый фрагмент должен отобразиться на месте главного фрагмента. А потом пользователь еще и захочет вернуться обратно... ViewPager2 список Fragment-ов (например, разделы анкеты или многостраничный раздел настроек) Kotlin (Java), Android собственно Необходимо заменять фрагменты динамически - на месте n-ого фрагмента должен появится другой. При этом все остальные страницы не должны терять своего состояния. Пример:  Есть три фрагмента. Первый - список любимых тарелок, второй - экран с сообщениями, третий - настройки.  Пользователь на первом экране выбирает тарелку -> меняем первый фрагмент на фрагмент "Информация о тарелке" Пользователь листает свайпами или выбирает через TabLayout третий экран - "Настройки", выбирает раздел "Выбор языка" -> меняем третий фрагмент на фрагмент "Выбор языка"Теперь пользователь, не выходя из выбора языка, листает до первого фрагмента. Он должен увидеть информацию о тарелке, а не список любимых тарелок.  Итак, пытаемся сдружить ArrayMap и ViewPager2. Будет такой Пишу, потому что найти хороших решений по этой задаче не смог, хотя вроде пытался усердно. Код местами специально упрощен - не люблю, когда в статьях добавляют десятки строк, не касающихся решения описываемой задачи, только ради соблюдения всех правил. Так что: строковые ресурсы - вынести, вью модели для фрагментов - добавить, пару уровней абстракций - ну вы поняли Весь проект - https://github.com/IDolgopolov/ViewPager2_FragmentReplacer Иногда буду использовать слово "страницы" - имею ввиду позицию, на которой отображается фрагмент во ViewPager. Например, "Список любимых тарелок", "Экран сообщений" и "Настройки" - три страницы. Фрагмент "Выбор языка" заменяет третью страницу. Сначала ничего интересного, просто для общего ознакомления Опишем функции, которые нам понадобятся для смены фрагментов Все фрагменты, добавляемые во ViewPagerAdapter (MyViewPager2Adapter описан ниже), будут наследоваться от BaseFragment.  Определим в нем переменные для хранения: pageId - уникальный номер страницы. Может быть любым числом, но главное - уникальным и большим, чем у вас позиций страниц (pageId > PAGE_COUNT - 1), иначе будут баги из-за метода getItemId() pagePos - номер странице, на которой будет отображаться фрагмент во ViewPager (начиная с 0, естественно) fragmentReplacer - ссылка на ViewPagerAdapter (MyViewPager2Adapter реализует FragmentReplacer) В этом классе будут реализован интерфейс FragmentReplacer и переопределены несколько классов FragmentStateAdapter. Это и позволит менять фрагменты на лету. В первую очередь переопределим четыре метода FragmentStateAdapter: Теперь две функции, которые позволяют подменять фрагменты Все готово - у каждого фрагмента есть ссылка на адаптер, значит есть возможность заменить фрагмент на любой странице, а самое главное (наиболее используемое на практике) - есть возмжность заменить самого себя. Например, фрагмент, по умолчанию, отображаемый на первой странице: FragmentOne.kt FragmentDeep.kt Аккуратно, если фрагменты тяжелые, - надо задуматься об очищении mapOfFragment. Возможно, стоит хранить Class<BaseFragment> вместо BaseFragment. Но тогда придется инициализировать их каждый раз в createFragment(). Меньше памяти, больше времени. Что думаете?  dendolg.ru - портфолио, контакты для сотрудничества (после переезда на GithubPages браузер иногда банит https протокол, а иногда не банит - разбираюсь) t.me/dolgopolovd - блог с нулем подписчиков, в котором рассуждаю о мобильном и промышленном дизайне и иногда отвлекаюсь от программирования