记录一个工作遇到的问题。PagerAdapter的显示问题
这个问题出现的的情况是在我们首页展示展示的情况。
在首页我们有一个fragments,其中第二个fragment中有一个viewpager。这个时候我们的首页有可能展示第一个,有可能展示第二个。然后我们会记录当前展示的页面的pageName,然后去进行页面埋点统计。 这个时候我们监听了Fragement的onResume和setUserVisibleHint的两个方法,来进行当前页面的统计。
我们在展示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) {
}
}
网友评论