it-swarm.com.ru

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

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

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

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

68
David S.

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

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

Из Javadoc

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

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

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

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

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

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

20
hcpl

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

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");
    }
}
65
miroslavign

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

9
Leo Landau

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

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

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

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

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

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

3
awy

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

2
roflharrison

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

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

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

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

Котлин:

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

0
s-hunter