Видимость текущего фрагмента ViewPager

Что у меня

У меня есть ViewPager с 5 фрагментами. Я хочу анимировать некоторые TextView внутри фрагментов, когда они становятся видимыми для пользователя.

Я не могу использовать onResume(), поскольку фрагменты влево и вправо уже созданы. Я не могу использовать setUserVisibilityHint(), поскольку он вызывается перед onCreateView(), поэтому представления еще не готовы.

Итак, каков должен быть способ анимации представлений всякий раз, когда конкретный фрагмент становится видимым для пользователя?

Ответ 1

Я не уверен, но если вы скажете, что setUserVisibilityHint вызовы перед onCreateView, чем check view on null здесь (сделайте ссылку в поле view), и если это не null - анимируйте его. Также анимируйте его всегда в onCreateView.

Ответ 2

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

Вы можете использовать FragmentViewPager библиотеку (я автор), которая касается проблемы, с которой вы столкнулись. Его функции:

  • позволяет его страницам Fragment получать уведомления, когда они на самом деле видимый/невидимый для пользователя
  • поддерживает несколько уровней FragmentViewPagers (вложенность)
  • предоставляет методы для управления своим поисковым сервером

Основное использование:

  • Приложить FragmentViewPager программным способом или через XML к Activity или фрагмент, так как вы бы с нативным ViewPager
  • Установите адаптер FragmentViewPager. Ваш адаптер должен наследовать com.sbrukhanda.fragmentviewpager.adapters.FragmentPagerAdapter или com.sbrukhanda.fragmentviewpager.adapters.FragmentStatePagerAdapter
  • Переопределить onResumeFragments() хостинга. Действия и вызов FragmentViewPager.notifyPagerVisible():

    private FragmentViewPager mFragmentsPager;
    
    @Override 
    public void onResumeFragments() {
        super.onResumeFragments();
        mFragmentsPager.notifyPagerVisible();
        ... 
    }
    

    или onResume() фрагмента хостинга и вызова FragmentViewPager.notifyPagerVisible():

    private FragmentViewPager mFragmentsPager;
    
    @Override 
    public void onResume() {
        super.onResume();
        mFragmentsPager.notifyPagerVisible();
        ... 
    }
    
  • Переопределить onPause() действия или фрагмента хостинга FragmentViewPager.notifyPagerInvisible():

    private FragmentViewPager mFragmentsPager;
    
    @Override 
    public void onPause() {
        super.onPause();
        mFragmentsPager.notifyPagerInvisible();
        ... 
    }
    
  • Внедрите FragmentVisibilityListener на всех страницах фрагмента, которые вы хотите получать обратные вызовы для своего состояния видимости.
  • Вы готовы к работе!

Если вы хотите увидеть более полный образец кода, то проверьте проект образец проекта.

Ответ 3

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

Ответ 4

(1) Я не могу использовать onResume(), поскольку фрагменты влево и вправо уже созданы. (2) Я не могу использовать setUserVisibilityHint(), поскольку он вызывается перед onCreateView(), поэтому представления еще не готовы.

Итак, каков должен быть способ анимации представлений всякий раз, когда конкретный фрагмент становится видимым для пользователя?

Вы правы на (1) и (2). Тем не менее, setUserVisibilityHint() получает вызов снова со значением True после того, как Фрагмент перейдет на Front on Display. Но при первом запуске фрагмент, который будет показан, получает его setUserVisibilityHint(), называемый до onCreateView().

SOL: Вы должны использовать приведенное выше поведение setUserVisibilityHint() вместе с onResume() для анимации представлений всякий раз, когда конкретный фрагмент становится видимым для пользователя.

  • Сценарий 1: первый запуск: отображаемый фрагмент setUserVisibilityHint(boolean isVisibleToUser) вызывается с Значение истинного значения. Но поскольку состояние фрагмента не возобновлено, мы откладываем и позволяем анимации дескриптора onResume().
  • Сценарий 2: для других фрагментов, которые уже находятся в состоянии возобновления, setUserVisibilityHint(boolean isVisibleToUser) будет вызван с Истинный параметр, который они приходят на дисплей. Здесь вы проверяете Фрагмент Анимация или нет и анимация.

CODE

a) Объявить два глобальных булевых поля: isAnimated и isOnDisplay

a.1) Установите isAnimated логическое значение в значение True;

b) Переопределить setUserVisibilityHint(boolean isVisibleToUser):

Здесь вы устанавливаете isOnDisplay boolean на isVisibleToUser и проверяете, является ли фрагмент уже не анимированным и находится в состоянии возобновления и доступен для пользователя.

{ if(!isAnimated && isResumed() && isVisibleToUser) // DO Animation }

c) Переопределить onResume()

Убедитесь, что фрагмент уже не анимирован и доступен для пользователя.

{ if(!isAnimated && isVisibleToUser) // DO Animation }