У меня есть ViewPager, который загружает три страницы за раз. Если я прокручу со страницы 1 на страницу 2, а затем до 3, первая страница (фрагмент) перейдет к onPause()
. Затем, если я перейду ко второй странице, первая страница перейдет к onResume()
, хотя страница 1 все еще не отображается пользователю. Итак, мой вопрос: как отличить первую и вторую страницы от кода? Например, если мне нужно запустить кусок кода, когда фрагмент будет виден, как это сделать?
Просмотр жизненного цикла пейджера и фрагмента
Ответ 1
В FragmentPagerAdapter сохраняются дополнительные фрагменты, кроме показанного в возобновленном состоянии. Решение заключается в реализации пользовательского OnPageChangeListener и создании нового метода для отображения фрагмента.
1) Создание интерфейса LifecycleManager Интерфейс будет иметь два метода, и каждый фрагмент ViewPagers будет реализовывать его. Эти методы:
public interface FragmentLifecycle {
public void onPauseFragment();
public void onResumeFragment();
}
2) Пусть каждый Фрагмент реализует интерфейс Добавить оператор ций для каждого объявления класса:
public class FragmentBlue extends Fragment implements FragmentLifecycle
public class FragmentGreen extends Fragment implements FragmentLifecycle
public class FragmentPink extends Fragment implements FragmentLifecycle
3) Внедрить методы интерфейса в каждом фрагменте Чтобы проверить, что он действительно работает, как ожидается, я просто зарегистрирую вызов метода и покажут Toast:
@Override
public void onPauseFragment() {
Log.i(TAG, "onPauseFragment()");
Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
@Override
public void onResumeFragment() {
Log.i(TAG, "onResumeFragment()");
Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
4) Методы интерфейса вызова на изменении страницы ViewPager Вы можете установить OnPageChangeListener на ViewPager и получить обратный вызов каждый раз, когда ViewPager показывает другую страницу:
pager.setOnPageChangeListener(pageChangeListener);
5) Внедрите OnPageChangeListener для вызова ваших пользовательских методов жизненного цикла
Listener знает новую позицию и может вызывать метод интерфейса на новом фрагменте с помощью PagerAdapter. Здесь я могу вызвать onResumeFragment() для нового фрагмента и onPauseFragment() для текущего.
Мне нужно также сохранить текущую позицию фрагментов (изначально текущая позиция равна 0), так как я не знаю, прокручивал ли пользователь слева направо или справа налево. Посмотрите, что я имею в виду в коде:
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageSelected(int newPosition) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
public void onPageScrollStateChanged(int arg0) { }
};
Я не писал код. Полный учебник здесь: http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/
Ответ 2
если ваш фрагмент расширяется. android.support.v4.app.Fragment
вы можете использовать это, он работает для меня.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (!isVisibleToUser) {
//do sth..
}
}
Ответ 3
Заменить setUserVisibleHint()
. Этот метод вызывается после того, как фрагмент будет виден пользователю.
Ответ 4
user method pager.setOffscreenPageLimit(numbr), чтобы установить, сколько фрагментов вы хотите в стеке удерживать.