Забороніть ViewPager знищувати перегляди поза екраном


133

У мене ViewPager підключений до FragmentPagerAdapter, який відображає три фрагменти. Схоже, ViewPager зруйнує подання розміщеного фрагмента, коли він проходить більше ніж один пальцем від поточної позиції.

Ці перегляди - це прості списки, і ця оптимізація зовсім непотрібна, тому я хотів би її відключити. Це викликає деякі візуальні проблеми, оскільки до списків застосовані анімаційні розкладки, а анімації відтворюються після їх знищення та відтворення. Він також щоразу показує вступну анімацію смуги прокрутки (де панель прокрутки коротко видно, що свідчить про можливу прокрутку), що може відволікати увагу, і поточне положення прокрутки користувача втрачається в процесі.

Він також не завантажує третій фрагмент, доки не відбудеться перший прогін, що є проблематичним, оскільки кожен фрагмент обробляє власні виклики служби, і я вважаю за краще, щоб усі три загоряння були вимкнені одночасно, коли активність завантажується. Затримка третього телефонного дзвінка менш ідеальна.

Чи є спосіб переконати ViewPager припинити цю поведінку і просто зберегти всі мої фрагменти в пам’яті?

Відповіді:


332

У редакції 4 Пакету підтримки до ViewPager було додано метод, який дозволяє вказати кількість сторінок на екрані, що використовуються, а не за замовчуванням, який становить 1.

У вашому випадку ви хочете вказати 2, щоб, коли ви знаходитесь на третій сторінці, перша не була знищена, і навпаки.

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

будь-яка ідея, як це зробити на потоці?
Йосиф

4
Привіт. У тому, над чим я працюю, фрагменти / сторінки створюються динамічно, тож існує невизначена кількість ймовірних фрагментів. У цьому випадку вона зазвичай йде до 10 і менше. Чи не буде поганим використанням пам'яті використовувати це рішення на стільки сторінок? Фрагменти будуть містити лише вид, до речі. Дякую!
mahkie

Цей метод кидає: "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.