Ответ 1
Я не уверен, но если вы скажете, что setUserVisibilityHint
вызовы перед onCreateView
, чем check view on null здесь (сделайте ссылку в поле view), и если это не null - анимируйте его. Также анимируйте его всегда в onCreateView
.
Что у меня
У меня есть ViewPager с 5 фрагментами. Я хочу анимировать некоторые TextView внутри фрагментов, когда они становятся видимыми для пользователя.
Я не могу использовать onResume(), поскольку фрагменты влево и вправо уже созданы. Я не могу использовать setUserVisibilityHint(), поскольку он вызывается перед onCreateView(), поэтому представления еще не готовы.
Итак, каков должен быть способ анимации представлений всякий раз, когда конкретный фрагмент становится видимым для пользователя?
Я не уверен, но если вы скажете, что setUserVisibilityHint
вызовы перед onCreateView
, чем check view on null здесь (сделайте ссылку в поле view), и если это не null - анимируйте его. Также анимируйте его всегда в onCreateView
.
Я знаю, что этот ответ может быть немного запоздалым, но я надеюсь, что он может помочь другим в подобной ситуации.
Вы можете использовать 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
на всех страницах фрагмента, которые вы
хотите получать обратные вызовы для своего состояния видимости.Если вы хотите увидеть более полный образец кода, то проверьте проект образец проекта.
Если вы хотите сделать это в отдельных фрагментах, вы можете использовать isVisible()
для каждого фрагмента в вашем переходе фрагмента и создания слушателя. Всякий раз, когда фрагмент станет видимым, будет вызываться прослушиватель, и каждый фрагмент будет реализовывать этот прослушиватель и выполнить намеченную задачу в переопределенном методе.
(1) Я не могу использовать onResume(), поскольку фрагменты влево и вправо уже созданы. (2) Я не могу использовать setUserVisibilityHint(), поскольку он вызывается перед onCreateView(), поэтому представления еще не готовы.
Итак, каков должен быть способ анимации представлений всякий раз, когда конкретный фрагмент становится видимым для пользователя?
Вы правы на (1) и (2). Тем не менее, setUserVisibilityHint()
получает вызов снова со значением True после того, как Фрагмент перейдет на Front on Display. Но при первом запуске фрагмент, который будет показан, получает его setUserVisibilityHint()
, называемый до onCreateView()
.
SOL: Вы должны использовать приведенное выше поведение setUserVisibilityHint()
вместе с onResume()
для анимации представлений всякий раз, когда конкретный фрагмент становится видимым для пользователя.
setUserVisibilityHint(boolean isVisibleToUser)
вызывается с
Значение истинного значения. Но поскольку состояние фрагмента не возобновлено, мы откладываем и позволяем анимации дескриптора onResume()
.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 }