Как go напрямую к указанному c фрагменту, используя ViewPager2 - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь создать приложение, использующее Viewpager2, которое позволяет прокручивать фрагменты, похожие на изображение ниже, но БЕЗ вкладки вверху.

enter image description here

Поэтому, если вы прокручиваете влево и вправо, вы можете переключаться между фрагментами. Это хорошо и прекрасно.

Однако в моем последнем приложении будет более 5 вкладок, поэтому я не хочу, чтобы макет вкладок был указан сверху. Вместо этого у меня была бы опция меню, которая позволяла бы пользователю выбирать, какой фрагмент просматривать.

Я не могу понять, как заставить просмотрщик на go напрямую указывать c фрагмент (например, из 2-го фрагмента). к пятому фрагменту), и при навигации между фрагментами я не хочу, чтобы фрагмент начинался с нуля, если он уже был создан.

Я использую FragmentStateAdapter с моим ViewPager2. Должен ли я использовать другой адаптер для этого? Любые идеи будут великолепны.

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Самый простой способ реализовать эту функцию - определить свой ViewPager как stati c в своей деятельности (чтобы вы могли получить к нему доступ из любого места в вашем приложении, включая фрагменты). Вы можете сделать его опубликованным c, или вы можете сделать его приватным и создать для него геттер.

private static ViewPager mViewPager; // This is the global variable 
public static ViewPager getViewPager() { return mViewpager; } // This is the getter

Теперь предположим, что у нас есть действие MainActivity, которое содержит ViewPager. Каждый фрагмент внутри этого ViewPager содержит кнопку, которая должна управлять страницей (не обязательно должна быть в ViewPager, может находиться где угодно, если она имеет ссылку на вашу активность и эта активность все еще выполняется, поэтому не запускайте другую). one).

ViewPager содержит метод

setCurrentItem(int item, boolean smoothScroll)

(smoothScroll не обязателен и предназначен только для анимации)

Теперь вы можете сделать:

MainActivity.getViewPager().setCurrentItem(itemNr);

Или, если вам нужна необычная анимация прокрутки:

MainActivity.getViewPager().setCurrentItem(itemNr, true);

Теперь ваш второй вопрос / проблема заключалась в том, что вы упомянули, что не хотите, чтобы фрагменты воссоздались. В этом случае я думаю, что лучше использовать FragmentPagerAdapter, который поддерживает ваши фрагменты. Вы можете вызвать следующий метод, чтобы установить ограничение для этих страниц:

mViewPager.setOffscreenPageLimit(LauncherViewPageAdapter.NUMBER_OF_PAGES); //NUMBER_OF_PAGES was just a static constant in my LauncherViewPageAdapter class which extended ViewPageAdapter.

Примечание. По умолчанию это ограничение равно 3, но вам действительно не нужно беспокоиться о производительности. Я реализовал 4 страницы / фрагменты (виджеты, плитки, список приложений, настройки приложения) без проблем с памятью (даже на старых устройствах). Только не кладите их полностью с растровыми изображениями / интенсивным использованием памяти.

В настоящее время я работаю над приложением запуска, которое также использует ViewPager, поэтому не стесняйтесь отвечать на вопрос о ViewPager, так как я решил основные проблемы c, которые у меня были.

1 голос
/ 01 марта 2020

Вы можете использовать setCurrentItem метод вашего ViewPager2. Просто передайте индекс wi sh, чтобы перейти к нулю, начиная с 0. Что касается нежелания фрагментов начинаться с нуля, просто используйте setOffscreenPageLimit метод viewpager2 и установите его равным 4, если у вас есть 5 страниц. так что все 5 страниц остаются в памяти. Это на самом деле побеждает цели FragmentStateAdapter и ViewPager2 хотя.

...