How to determine when Fragment becomes visible in ViewPager How to determine when Fragment becomes visible in ViewPager android android

How to determine when Fragment becomes visible in ViewPager


How to determine when Fragment becomes visible in ViewPager

You can do the following by overriding setUserVisibleHint in your Fragment:

public class MyFragment extends Fragment {    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if (isVisibleToUser) {        }        else {        }    }}


UPDATE: Android Support Library (rev 11) finally fixed the user visible hint issue, now if you use support library for fragments, then you can safely use getUserVisibleHint() or override setUserVisibleHint() to capture the changes as described by gorn's answer.

UPDATE 1 Here is one small problem with getUserVisibleHint(). This value is by default true.

// Hint provided by the app that this fragment is currently visible to the user.boolean mUserVisibleHint = true;

So there might be a problem when you try to use it before setUserVisibleHint() was invoked. As a workaround you might set value in onCreate method like this.

public void onCreate(@Nullable Bundle savedInstanceState) {    setUserVisibleHint(false);

The outdated answer:

In most use cases, ViewPager only show one page at a time, but the pre-cached fragments are also put to "visible" state (actually invisible) if you are using FragmentStatePagerAdapter in Android Support Library pre-r11.

I override :

public class MyFragment extends Fragment {    @Override    public void setMenuVisibility(final boolean visible) {        super.setMenuVisibility(visible);        if (visible) {            // ...        }    }   // ...}

To capture the focus state of fragment, which I think is the most suitable state of the "visibility" you mean, since only one fragment in ViewPager can actually place its menu items together with parent activity's items.


This seems to restore the normal onResume() behavior that you would expect. It plays well with pressing the home key to leave the app and then re-entering the app. onResume() is not called twice in a row.

@Overridepublic void setUserVisibleHint(boolean visible){    super.setUserVisibleHint(visible);    if (visible && isResumed())    {        //Only manually call onResume if fragment is already visible        //Otherwise allow natural fragment lifecycle to call onResume        onResume();    }}@Overridepublic void onResume(){    super.onResume();    if (!getUserVisibleHint())    {        return;    }    //INSERT CUSTOM CODE HERE}