我有一个片段,ViewPager有4个选项卡,在第4个选项卡中,我有另一个带有3个选项卡的ViewPager。这样,如果每当我切换我的topviewPagerTab(一个带有4个选项卡)时,子ViewPager(带有3个标签)中片段的setUserVisiblehint就不会被调用。
因此,事实上,第四个/最后一个选项卡的子视图Pager中的片段对用户来说是不可见的,但没有调用setUserVisibleHint(),所以我在访问该片段时设置的布尔值isMyPageVisible对他们来说总是真的,除非我在子视图Pager中切换选项卡
boolean isPageVisible = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isPageVisible = isVisibleToUser;
}
public class UserAdapter extends FragmentPagerAdapter
{
private ArrayList<Fragment> fragments;
public UserAdapter(FragmentManager fm, ArrayList<Fragment> fragments)
{
super(fm);
this.fragments = fragments;
}
public void clearFragment()
{
fragments.clear();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
public void setUserVisibleHint(boolean isUserVisibleHint)
{
if(viewPagerPojos != null && viewPagerPojos.size() > 0)
{
for(ViewPagerPojo viewPagerPojo : viewPagerPojos)
{
viewPagerPojo.getFragment().setUserVisibleHint(isUserVisibleHint);
}
}
}
}
并且在每个片段中
@Override
public void setUserVisibleHint(boolean isVisible) {
super.setUserVisibleHint(isVisible);
if (mAdaptor != null) {
mAdaptor.setUserVisibleHint(isVisible);
}
}
和子片段
boolean isPageVisible;
@Override
public void setUserVisibleHint(boolean isVisibleHint)
{
isPageVisible = this.isVisible() && isVisibleHint;
super.setUserVisibleHint(isPageVisible);
}
问题是,当您在外部片段之间移动时,不会调用内部viewpager中显示的当前片段的setUserVisibleHint。扩展FragmentStatePagerAdaptor
public class CustomPagerAdaptor extends FragmentStatePagerAdaptor {
private Fragment primary;
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
primary = (Fragment)object;
}
public void setUserVisibleHint(boolean isVisible) {
if (primary != null){
primary.setUserVisibleHint(isVisible);
}
}
}
在外部片段中,通过:传递setUserVisibleHint
@Override
public void setUserVisibleHint(boolean isVisible) {
super.setUserVisibleHint(isVisible);
if (mAdaptor != null) mAdaptor.setUserVisibleHint(isVisible);
}