Created
April 25, 2017 03:21
-
-
Save chiemy/fb1b3272ef269706afb867a189eb1791 to your computer and use it in GitHub Desktop.
ViewPager 内 Fragment 嵌套 ViewPager, setUserVisibleHint 方法不准确的问题的帮助类
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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