2013-04-15 80 views
9

我有一个ViewPager内的水平滚动视图。为了防止当达到了滚动结束时,我使用这个类按照提示在SO被滚动的ViewPager:OnClickListener在自定义滚动视图内的视图

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似乎消耗任何点击该View和里面的一切。当我将Views放入该ScrollView时,它们的OnClickListener将不会被调用。

当我让onInterceptTouchEvent返回false时,调用OnClickListener s,但ScrollView不能滚动。

如何将可点击视图放入ScrollView

编辑:实施Rotem的答案后,onClickListener的作品,但它不仅触发点击事件,而且在其他人,如一扔。这怎么能被阻止?

回答

5

好了,开始一个赏金我发现它是如何工作分钟后:在onInterceptTouchEvent

return super.onInterceptTouchEvent(p_event); 
+2

如果你只叫超与相同参数,没有必要重写方法 – Rotem

+0

确保你读了[Javadoc中(http://developer.android.com/ reference/android/view/ViewGroup.html#onInterceptTouchEvent%28android.view.MotionEvent%29),它描述了你的问题。正如Rotem所说,你不需要执行这个。 –

11

试着拨打onTouchEvent里面执行onInterceptTouchEvent然后返回false。

+0

作品,非常感谢你:) – FWeigl

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

}