在另一个Viewpager内的Viewpager中未调用片段setUserVisibleHint



我有一个片段,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);
}

最新更新