自定义ScrollView中的视图上的OnClickListener

时间:2013-04-15 14:41:51

标签: android

我在ViewPager中有一个水平的ScrollView。为了防止在达到ScrollView结束时滚动ViewPager,我按照SO上的提示使用这个类:

public class CustomScrollView extends HorizontalScrollView {

public CustomScrollView(Context p_context, AttributeSet p_attrs) {
    super(p_context, p_attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent p_event) {

    return true;
}

@Override
public boolean onTouchEvent(MotionEvent p_event) {


    if (p_event.getAction() == MotionEvent.ACTION_MOVE
            && getParent() != null) {
        getParent().requestDisallowInterceptTouchEvent(true);
    }

    return super.onTouchEvent(p_event);
}
}

onInterCeptTouchEvent似乎消耗了对该视图的任何点击以及其中的所有内容。当我将Views放入ScrollView时,他们的OnClickListener将不会被调用。

当我onInterceptTouchEvent返回false时,会调用OnClickListener,但无法滚动ScrollView

如何将可点击的视图放在ScrollView

编辑:在实施Rotem的答案后,onClickListener可以正常工作,但它不仅会触发点击事件,还会触发其他事件,例如投掷。如何防止这种情况?

3 个答案:

答案 0 :(得分:11)

尝试在onTouchEvent的实现中调用onInterceptTouchEvent,然后返回false。

答案 1 :(得分:5)

好吧,在开始赏金后几分钟我发现它是如何运作的:

onInterceptTouchEvent

中的

return super.onInterceptTouchEvent(p_event);

答案 2 :(得分:1)

以下是使用此问题答案的完整解决方案。

public class CustomHorizontalScrollView extends HorizontalScrollView {

        public CustomHorizontalScrollView(Context context) {
                super(context);

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

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
                boolean result = super.onInterceptTouchEvent(ev);
                if(onTouchEvent(ev)) {
                        return result;
                } else {
                        return false;
                }
        }

        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_MOVE
                    && getParent() != null) {
                getParent().requestDisallowInterceptTouchEvent(true);
            }
                return super.onTouchEvent(ev);
        }

}