You should check if the parent is fragment and visible or isn't fragment then start your logic.
public class Child1FragmentC extend Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isParentFragmentVisible())
//TODO: start your logic
}
/**
*
* @return true if the parent is fragment and visible or the parent isn't fragment
*/
boolean isParentFragmentVisible() {
return getParentFragment() == null || getParentFragment().getUserVisibleHint();
}
}
Now when the platform will call the first fragment on fragment C, it will ask it's parent fragment C and it will be invisible so it won't start it's logic.
Also when fragment C visibility changed the platform won't notify the first fragment on fragment c that it's visibility changed because the platform told it before and we didn't start the logic because the parent was invisible.
So we need to make the fragment c when it's visibility changed to notify the current visible fragment in it's view pager(first fragment of fragment C) that the visibility changed.
public class FragmentC extend Fragment {
/**
* Notify the current selected fragment inside view pager that it's visibility changed.
*
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
//TODO: start your logic
//Notify the current fragment in view pager the the isVisibleToUser changed.
Fragment currentFragment = getChildFragmentManager().findFragmentByTag(
"android:switcher:" + getViewPagerId() + ":" + getViewPager().getCurrentItem());
if (currentFragment != null)
currentFragment.setUserVisibleHint(isVisibleToUser);
}
}
Another thing you should handle is the platform call the setUserVisibilityHint before view is created so you should check that the view is prepared by checking that getView() != null or any other conditions.
So the final code will be like this.
public abstract class BaseFragment extend Fragment {
/**
* start logic if isVisibleToUser, isViewPrepared and isParentFragmentVisible equal true.
*
* => We check isViewPrepared equal true before starting logic because setUserVisibleHint
* called before all fragment lifecycle callbacks. So we should check if the view is
* prepared.
*
* => We check if the parent is visible to solve if we have a fragment inside a view pager and
* that fragment also has view pager that contains children fragments but this fragment isn't
* visible right now. the platform will call the first child fragment in the view pager that
* it's visibility is true.
*
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isViewPrepared() && isParentFragmentVisible())
//TODO: start your logic
}
/**
*
* @return true if the parent is fragment and visible or the parent isn't fragment
*/
boolean isParentFragmentVisible() {
return getParentFragment() == null || getParentFragment().getUserVisibleHint();
}
/**
*
* @return true if the view isn't null
*/
boolean isViewPrepared() {
return getView() != null;
}
}
/**
* Use this base fragment when you have fragment that has view pager and you want to handle
* when child fragments become actually visible to the user to start the logic.
*/
public abstract class BaseBootstrapHostViewPagerFragment extends BaseFragment {
/**
* Notify the current selected fragment inside view pager that it's setUserVisibleHint changed.
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isViewPrepared()) {
Fragment currentFragment = getChildFragmentManager().findFragmentByTag(
"android:switcher:" + getViewPagerId() + ":" + getViewPager().getCurrentItem());
if (currentFragment != null)
currentFragment.setUserVisibleHint(isVisibleToUser);
}
}
public abstract int getViewPagerId();
public abstract ViewPager getViewPager();
}
public FragmentC extend BaseBootstrapHostViewPagerFragment {....}
public Child1FragmentC extend BaseFragment {....}