我在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
可以正常工作,但它不仅会触发点击事件,还会触发其他事件,例如投掷。如何防止这种情况?
答案 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);
}
}