问题 在ScrollViews中使用带有ViewPagers的ScrollViews的Android ViewPager


所以我的活动有一个主ViewPager,在ViewPager里面,每个页面都有一个ScrollView的内容,而在ScrollView里面还有另一个ViewPager。

这可能听起来很疯狂,但基本上外部的ViewPager包含新闻文章,文章很长,所以有一个ScrollView,在ScrollView中有多个缩略图/图片,他们也可以刷过。

我尝试了一些不同的自定义ViewPagers,它们具有不同的触摸事件拦截,但似乎无法完美。它要么完全吸收所有触摸事件,要么ScrollView的垂直滚动在该区域不起作用,否则将使内部水平滚动非常敏感/困难。

有人有完美的解决方案吗?


6024
2018-06-11 20:33


起源

你解决了问题吗?我正在努力做你尝试过的事情。 - tasomaniac
是的我的解决方案如下。如果您需要帮助,请告诉我! - egfconnor
我尝试过这个解决方案,但它给了我滚动布局中可点击项目的问题。当我在可点击项目上垂直滚动时,滚动视图不滚动。 - tasomaniac
我有完全相同的布局。可点击的项目位于ScrollView中。还有第二种方法可以做你在stackoverflow中找到的同样的事情。在该解决方案中,他们计算所有内容而不是使用GestureDetector。我用过它,问题就消失了。谢谢。 - tasomaniac
当然。我正在使用以下链接中所选答案下面的答案: stackoverflow.com/questions/2646028/... - tasomaniac


答案:


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

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);
}
}

12
2018-06-12 15:25



这段代码救了我的命!谢谢 :) - Erdinç Özdemir
很高兴它帮助了你! - egfconnor
嘿我有一个滚动视图的问题,并在其中查看寻呼机但垂直滚动即使使用ur custon scrollview也不起作用? - Antwan
@egfconnor你的解决方案对我不起.. :(我无法垂直滚动查看寻呼机。 - Aks4125
您好,请您详细说明您的答案吗?你怎么告诉你的NestingViewPager使用CustomScrollView而不是普通的ScrollView?谢谢 - Loebre