Как проверить, является ли вид фрагмента видимым для пользователя? - PullRequest
71 голосов
/ 17 февраля 2012

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

  • фрагмент прикреплен к деятельности
  • фрагмент установлен в видимый
  • фрагмент был добавлен в представление

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

Ответы [ 10 ]

67 голосов
/ 25 сентября 2012

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

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");
    }
}
20 голосов
/ 14 мая 2013

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

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

Из javadoc

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

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

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

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

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

Так что было бы неплохо также присоединить ViewPager.OnPageChangeListener и делать то, что должно быть сделано, только когда состояние прокрутки виджетов становится SCOLL_STATE_IDLE снова.1033 *

9 голосов
/ 08 июля 2013

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

3 голосов
/ 19 августа 2015
isVisible() 

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

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

if (getView() != null && getView().isShown()) {
//your code here
}
3 голосов
/ 20 августа 2014

Что не так с использованием getView().isShown(), чтобы выяснить, действительно ли фрагмент виден?

3 голосов
/ 13 июня 2014

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

2 голосов
/ 17 февраля 2012

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

0 голосов
/ 19 мая 2018

Kotlin:

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

Java

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

0 голосов
/ 05 апреля 2017

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

if (currentFragment != null) {
    currentFragment.onResume();
}
0 голосов
/ 26 июля 2016

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

 @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();
        }
    }
}
...