Предотвратить ViewPager от разрушения за пределами экрана - PullRequest
127 голосов
/ 02 декабря 2011

У меня ViewPager подключен к FragmentPagerAdapter, который отображает три фрагмента. ViewPager, по-видимому, уничтожает вид размещенного фрагмента, когда он находится на расстоянии более одного удара от текущей позиции.

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

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

Есть ли способ убедить ViewPager прекратить это поведение и просто сохранить все мои фрагменты в памяти?

Ответы [ 3 ]

320 голосов
/ 02 декабря 2011

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

В вашем случае вы хотите указать 2, чтобы при переходе на третью страницу первая не была уничтожена, и наоборот.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
6 голосов
/ 11 апреля 2017

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

1. В onCreate () ваших фрагментов вызовите setRetainInstance (true).

2. Если количество фрагментов фиксировано и относительно мало, то в onCreate () добавьте следующий код:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

Если я правильно помню, второй вариант более перспективный. Но я призываю вас попробовать оба варианта и посмотреть, какие из них работают.

3 голосов
/ 03 января 2014

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

http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

...