最近做项目用到SlideDetailsLayout这个控件,github地址:https://github.com/cnbleu/SlideDetailsLayout
在behind页面里用到了ViewPager,发现里面嵌套的ScrollView与SlideDetailsLayout出现事件冲突,表现为SrollView没有滑动回顶部就返回SlideDetailsLayout的front页面了。
经过研究SlideDetailsLayout的代码后,通过在innerCanChildScrollVertically方法中加入对ViewPager的处理逻辑后最终解决了这个问题,下面是具体步骤。
第一步:在定义的PagerAdpter类中通过重写setPrimaryItem方法获取到当前显示的Fragment
public Fragment currentFragment;
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
currentFragment = (Fragment) object;
}
第二步:在SlideDetailsLayout类中的innerCanChildScrollVertically方法中增加对ViewPager的处理逻辑,下面是修改后的方法。
private boolean innerCanChildScrollVertically(View view, int direction) {
if (view instanceof ViewGroup) {
final ViewGroup vGroup = (ViewGroup) view;
View child;
boolean result;
for (int i = 0; i < vGroup.getChildCount(); i++) {
child = vGroup.getChildAt(i);
//支持ViewPager里面的子控件滚动 by:York
if (child instanceof ViewPager) {
final ViewPager viewPager = (ViewPager) child;
//自定义的PageAdapter
final SilderPagerAdapter pagerAdapter = (SilderPagerAdapter) viewPager.getAdapter();
return innerCanChildScrollVertically(pagerAdapter.currentFragment.getView(), direction);
} else {
if (child instanceof View) {
result = ViewCompat.canScrollVertically(child, direction);
} else {
result = innerCanChildScrollVertically(child, direction);
}
if (result) {
return true;
}
}
}
}
return ViewCompat.canScrollVertically(view, direction);
}
至此,大功告成!