Как проверить, является ли вид fragmentа видимым для пользователя?

У меня есть ViewPager, каждая страница представляет собой fragment. Я хочу проверить, находится ли fragment в видимой области. только тест Fragment.isVisible

  • fragment присоединен к активности
  • fragment установлен на видимый
  • fragment был добавлен в представление

ViewPager создаст 3 (по умолчанию) fragment, и все три из них соответствуют вышеуказанным критериям, но только один из них действительно отображается пользователю ( глаза человека)

Вы правы, это лучший способ сделать это!

Взгляните на FragmentPagerAdapter javadoc онлайн, и вы увидите, что существует метод setPrimaryItem (контейнер ViewGroup, позиция int, объект Object): void делает именно то, что вам нужно.

Из javadoc

public void setPrimaryItem (контейнер ViewGroup, позиция int, объект Object)

Вызывается, чтобы сообщить адаптеру, какой элемент в данный момент считается «основным», то есть одно шоу для пользователя в качестве текущей страницы.

Параметры container Содержит View, из которого будет удалена страница. position Позиция страницы, которая теперь является основной. object Тот же объект, который был возвращен функцией instantiateItem (View, int).

Примечание о состоянии прокрутки

Теперь, если вы реализуете это и начинаете отладку, чтобы понять, когда именно это называется, вы быстро заметите, что это несколько раз срабатывает при подготовке fragmentа, и пока пользователь щелкает.

Поэтому неплохо было бы также подключить ViewPager.OnPageChangeListener и делать то, что должно быть сделано после того, как состояние прокрутки viewpagers снова станет SCOLL_STATE_IDLE .

Это то, что я использую для определения видимости fragmentа.

 private static boolean m_iAmVisible; @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); m_iAmVisible = isVisibleToUser; if (m_iAmVisible) { Log.d(localTAG, "this fragment is now visible"); } else { Log.d(localTAG, "this fragment is now invisible"); } } 

Для моих целей он работал, чтобы использовать ViewPager.OnPageChangeListener.onPageSelected() в сочетании с Fragment.onActivityCreated() чтобы выполнить действие, когда Фрагмент виден. Fragment.getUserVisibleHint() тоже помогает.

Я использую метод setMenuVisibility -Method для решения этой проблемы. Поскольку каждый fragment может иметь элементы панели действий, это часть, в которой вы можете определить, какой fragment в данный момент отображается пользователю.

 @Override public void setMenuVisibility(final boolean visible) { super.setMenuVisibility(visible); if (!visible) { //not visible anymore }else{ yay visible to the user } } 

Что не так с помощью getView().isShown() чтобы узнать, действительно ли fragment?

 isVisible() 

Может по-прежнему возвращать true, даже если fragment находится за активностью.

Я использую следующее:

 if (getView() != null && getView().isShown()) { //your code here } 

Если вы знаете, к какой «странице» прикреплен каждый fragment, вы можете использовать ViewPager.getCurrentItem (), чтобы определить, какой fragment «видимый».

В моем случае ia должны выполнить некоторую работу над первым fragmentом, когда fragment будет виден пользователю

  @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(viewPager.getAdapter() instanceof YourPager) { Fragment fragemnt=((YourPager)viewPager.getAdapter()).getFragment(0); //getFragment(int index) custom method if( fragemnt instanceof YourFragment) { ((YourFragment)fragemnt).methodWhochShouldBeCalledAfterUIVisible(); } } } 

setUserVisibleHint возможно, не может быть вызван, onHiddenChanged может быть вызван не каждый раз, когда другой fragment закрывается. Таким образом, вы можете полагаться onResumeonPause ), но его обычно называют слишком часто (например, при включении экрана устройства). Также в некоторых ситуациях он не вызывается, вы должны управлять текущим fragmentом в активности хоста и писать:

 if (currentFragment != null) { currentFragment.onResume(); } 

Котлин:

 if (userVisibleHint) { // the fragment is visible } else { // the fragment is not visible } 

Ява

 if (getUserVisibleHint()) { // the fragment is visible } else { // the fragment is not visible } 

https://developer.android.com/reference/android/app/Fragment.html#getUserVisibleHint ()

https://stackoverflow.com/a/12523627/2069407

  • Одна активность и все остальные fragmentы
  • Получение ошибки «Активность Java.lang.IllegalStateException была уничтожена» при использовании вкладок с ViewPager
  • Панель инструментов Android Добавление элементов меню для разных fragmentов
  • Борьба с fragmentом поддержки проигрывателя Youtube
  • Поиск в Android с помощью fragmentов
  • Полный рабочий пример сценария анимации с тремя fragmentами Gmail?
  • Каковы различия между активностью и fragmentом
  • Как передать переменную от Activity to Fragment и передать ее обратно?
  • Как получить панель инструментов из fragmentа?
  • Почему обращается к TextView fragmentа внутри операции, вызывая ошибку
  • Дилемма: когда использовать Fragments vs Activities:
  • Давайте будем гением компьютера.