美文网首页
记录一个工作遇到的问题。PagerAdapter的显示问题

记录一个工作遇到的问题。PagerAdapter的显示问题

作者: 左耳钻爱思念 | 来源:发表于2019-07-11 18:50 被阅读0次

    记录一个工作遇到的问题。PagerAdapter的显示问题

    这个问题出现的的情况是在我们首页展示展示的情况。
    在首页我们有一个fragments,其中第二个fragment中有一个viewpager。这个时候我们的首页有可能展示第一个,有可能展示第二个。然后我们会记录当前展示的页面的pageName,然后去进行页面埋点统计。 这个时候我们监听了Fragement的onResume和setUserVisibleHint的两个方法,来进行当前页面的统计。

    image.png

    我们在展示AFragment的时候,初始化了B,然后建了一个viewpage的适配器PageAdapter。
    这个时候会发现 在第二个PagerAdapter,在初始化的时候绘制的过程中会强制调用setPrimaryItem的方法。
    其中会有setUserVisibleHint(true),其实,这个时候B的所有Fragment是不可见的。因此就会有问题。

    //PageAdapter的方法
    public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {    
    Fragment fragment = (Fragment)object;   
      if (fragment != this.mCurrentPrimaryItem) {    
             if (this.mCurrentPrimaryItem != null) {            
                     this.mCurrentPrimaryItem.setMenuVisibility(false);        
                     this.mCurrentPrimaryItem.setUserVisibleHint(false);         
             }         
            fragment.setMenuVisibility(true);   
            fragment.setUserVisibleHint(true);    
            this.mCurrentPrimaryItem = fragment;    
         }
     }
    

    修改的方法

    @Override
    public void setPrimaryItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        Fragment fragment = (Fragment) object;
        Fragment curPrimFragment = getCurrentPrimaryItem();
            if (fragment != curPrimFragment) {
                if (curPrimFragment != null) {
                    curPrimFragment.setMenuVisibility(false);
                    curPrimFragment.setUserVisibleHint(false);
                }
                 if (parentFragment == null) {
                    fragment.setMenuVisibility(true);
                    fragment.setUserVisibleHint(true);
                 } else {               
                    fragment.setMenuVisibility(parentFragment.getUserVisibleHint());
                     fragment.setUserVisibleHint(parentFragment.getUserVisibleHint());
                 }
                setCurrentPrimaryItem(fragment);
            }
    }
    
    @Nullable
    protected Fragment getCurrentPrimaryItem() {
    try {
            Field field = getClass().getSuperclass().getDeclaredField("mCurrentPrimaryItem");
            field.setAccessible(true);
            return (Fragment) field.get(this);
    } catch (Throwable e) {
        return null;
    }
    
    protected void setCurrentPrimaryItem(Fragment fragment) {
        try {
            Field field =       getClass().getSuperclass().getDeclaredField("mCurrentPrimaryItem");
            field.setAccessible(true);
            field.set(this, fragment);
        } catch (Throwable e) {
    
        }
    }
    
    
    
    

    相关文章

      网友评论

          本文标题:记录一个工作遇到的问题。PagerAdapter的显示问题

          本文链接:https://www.haomeiwen.com/subject/llcjkctx.html