Skip to content

Instantly share code, notes, and snippets.

@chiemy
Created April 25, 2017 03:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chiemy/fb1b3272ef269706afb867a189eb1791 to your computer and use it in GitHub Desktop.
Save chiemy/fb1b3272ef269706afb867a189eb1791 to your computer and use it in GitHub Desktop.
ViewPager 内 Fragment 嵌套 ViewPager, setUserVisibleHint 方法不准确的问题的帮助类
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
/**
* Created: chiemy
* Date: 17/1/4
* Description: 为解决 ViewPager 内 Fragment 嵌套 ViewPager, setUserVisibleHint 方法不准确的问题的帮助类
*/
public class NestedFragmentHelper implements ViewPager.OnPageChangeListener {
private Fragment mFragment;
private ViewPager mViewPager;
private boolean mIsVisible;
public NestedFragmentHelper(Fragment fragment) {
mFragment = fragment;
mIsVisible = fragment.getUserVisibleHint();
}
public void setupWithViewPager(ViewPager viewPager) {
mViewPager = viewPager;
mViewPager.addOnPageChangeListener(this);
}
public void setUserVisibleHint(boolean isVisibleToUser) {
mIsVisible = isVisibleToUser;
if (isVisibleToUser) {
currentChildFragmentVisible();
} else {
allChildBecomeInvisible();
}
}
private void allChildBecomeInvisible() {
if (mViewPager == null) {
return;
}
int size = mViewPager.getAdapter().getCount();
for (int i = 0; i < size; i++) {
fragmentVisibleChange(false, i);
}
}
private void currentChildFragmentVisible() {
if (mViewPager == null) {
return;
}
fragmentVisibleChange(true, mViewPager.getCurrentItem());
}
private void fragmentVisibleChange(boolean isVisibleToUser, int index) {
if (mViewPager == null) {
return;
}
Fragment nestedFragment = mFragment.getChildFragmentManager().findFragmentByTag(makeFragmentName(mViewPager.getId(), index));
if (nestedFragment instanceof NestedFragment) {
((NestedFragment) nestedFragment).setUserVisible(isVisibleToUser);
}
}
private static String makeFragmentName(int viewPagerId, int index) {
return "android:switcher:" + viewPagerId + ":" + index;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (!mIsVisible) {
return;
}
int size = mViewPager.getAdapter().getCount();
for (int i = 0; i < size; i++) {
fragmentVisibleChange(position == i, i);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
public interface NestedFragment {
void setUserVisible(boolean visible);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment