Android ViewPager与包含ViewPager的ScrollView共存问题

11

我有一个Activity,里面有一个主ViewPager,在ViewPager内的每个页面都有整个内容作为ScrollView,并且在ScrollView内部有另一个ViewPager。

这可能听起来很疯狂,但基本上外层的ViewPager包含新闻文章,而这些文章很长,因此有一个ScrollView,在ScrollView内有多个缩略图/图片可以通过滑动浏览。

我尝试了几种不同的自定义ViewPagers,并尝试拦截不同的触摸事件,但似乎无法完美地处理它。它要么完全吸收所有触摸事件,以至于该区域内的ScrollView的垂直滚动无法工作,要么在水平滚动内部ViewPager时非常敏感/难以使用。

有没有完美的解决方案呢?


你解决了你的问题吗?我正试图做跟你一样的事情。 - tasomaniac
是的,我的解决方案在下面。如果需要帮助,请告诉我! - egfconnor
我已经尝试过那个解决方案,但它给我的滚动布局中可点击项带来了问题。当我在可点击项上垂直滚动时,滚动视图不会滚动。 - tasomaniac
2
我有完全相同的布局。可点击的项目在ScrollView中。我在stackoverflow上找到了另一种做同样事情的方法。在那个解决方案中,他们计算了所有东西,而不是使用GestureDetector。我已经使用它,问题已经解决。谢谢。 - tasomaniac
1
当然。我正在使用以下链接中所选答案下方的内容:https://dev59.com/XHE85IYBdhLWcg3wtV71 - tasomaniac
显示剩余3条评论
1个回答

12

如果有人想了解我的解决方案:

public class CustomScrollView extends ScrollView {
private GestureDetector mGestureDetector;
View.OnTouchListener mGestureListener;

public CustomScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mGestureDetector = new GestureDetector(context, new YScrollDetector());
    setFadingEdgeLength(0);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    return super.onInterceptTouchEvent(ev)
            && mGestureDetector.onTouchEvent(ev);
}

// Return false if we're scrolling in the x direction
class YScrollDetector extends SimpleOnGestureListener {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
            float distanceX, float distanceY) {
        if (Math.abs(distanceY) > Math.abs(distanceX)) {
            return true;
        }
        return false;
    }
}
}

最外层的ViewPager是:

public class NestingViewPager extends ViewPager {

public NestingViewPager(final Context context, final AttributeSet attrs) {
    super(context, attrs);
}

public NestingViewPager(final Context context) {
    super(context);
}

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (v != this && v instanceof ViewPager) {
        return true;
    }
    return super.canScroll(v, checkV, dx, x, y);
}
}

嘿,我在一个滚动视图和其中的ViewPager中遇到了问题,但是即使使用了自定义ScrollView,垂直滚动也无法正常工作? - Antwan
@egfconnor,你的解决方案对我不起作用.. :( 我无法在视图翻页器上垂直滚动。 - Aks4125
你好,能否请您详细说明一下您的答案?您如何告诉您的 NestingViewPager 使用 CustomScrollView 而不是普通的 ScrollView?谢谢。 - Loebre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接