In my application, I have a ViewPager which holds many swipeable Tabs with Fragments inside. I use the setUserVisibleHint
method to detect when a Fragment
You have to call manually mViewPagerListener.onPageSelected(0);
in onCreateView
in your root activity/fragment.
I check your problem,but I find out the onCreateView
method is called before the
setUserVisibleHint
method
enter code here
because the setUserVisibleHint method is called before the onCreateView method
I dont understand what you need exactly but you can detect the page of the current fragment by calling ViewPager.getCurrentItem
that return integer.
Hope it helps.
Good luck.
BELOW WORKED FOR ME
Please create a global view like this
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
//inflate view layout
view =inflater.inflate(R.layout.your_fragment, container, false);
// return view
return view;
}
and use this
@Override
public void setUserVisibleHint(boolean isUserVisible)
{
super.setUserVisibleHint(isUserVisible);
// when fragment visible to user and view is not null then enter here.
if (isUserVisible && view != null)
{
onResume();
}
}
and In OnResume method
@Override
public void onResume() {
super.onResume();
if (!getUserVisibleHint()) {
return;
}
//do your stuff here
}
Well, its workaround more, and maybe its better to setup OnPageChangeListener
, but it works for me. The task is to determine whether the current fragment is visible at creation. You can use the menu to do this. In your fragment:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true); // set current fragment has its own options menu
}
and this
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
...
if(isMenuVisible()) { // menu should be visible if current fragment is visible right now
setUserVisibleHint(true); // manually set value to true
}
...
return view;
Maybe someone will find it usefull. This works for me.
You can't (and shouldn't) rely on setUserVisibleHint
for this. Instead, you should be using a ViewPager.OnPageChangeListener to get callbacks for when a page becomes visible. E.g.
viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// do your work
}
});
Note: You can use ViewPager.SimpleOnPageChangeListener
if you don't need to listen for all callbacks.
setOnPageChangeListener
method is now deprecated, use addOnPageChangeListener
instead
viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// do your work
}
});