Подтвердить что ты не робот

Просмотр жизненного цикла пейджера и фрагмента

У меня есть ViewPager, который загружает три страницы за раз. Если я прокручу со страницы 1 на страницу 2, а затем до 3, первая страница (фрагмент) перейдет к onPause(). Затем, если я перейду ко второй странице, первая страница перейдет к onResume(), хотя страница 1 все еще не отображается пользователю. Итак, мой вопрос: как отличить первую и вторую страницы от кода? Например, если мне нужно запустить кусок кода, когда фрагмент будет виден, как это сделать?

4b9b3361

Ответ 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), чтобы установить, сколько фрагментов вы хотите в стеке удерживать.