Предотвратить ViewPager от разрушения за пределами экрана


133

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

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

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

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

Ответы:


332

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

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

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

Любая идея, как это сделать на обложке?
— Джозефус

4
Привет. В чем я работаю, фрагменты / страницы создаются динамически, поэтому существует неограниченное количество возможных фрагментов. В этом случае обычно до 10 или меньше. Не будет ли плохое использование памяти, чтобы использовать это решение для такого количества страниц? Кстати, фрагменты будут содержать только вид. Спасибо!
— Махки

Этот метод выдает: «java.lang.IllegalStateException: фрагмент уже добавлен:» ошибка для моего приложения.
— alicanbatur

Большое спасибо. Это действительно сработало. У меня тоже была такая же проблема, как у @chefgon.
— Прашант

@mahie вышеупомянутые решения, если для этого предлагается в качестве оптимизации. Если вы заранее знаете количество * страниц, которые вам нужно будет поддерживать или у вас есть механизмы отложенной загрузки * на ваших страницах, настройка этого параметра может иметь преимущества в воспринимаемой плавности * анимации подкачки и взаимодействия. Если у вас есть небольшое количество страниц (3-4) *, которые вы можете поддерживать активными все сразу, меньше времени будет потрачено на макет для * вновь созданных представлений поддеревьев, когда пользовательские страницы
— перемещаются

8

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

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

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

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

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


3

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.