【问题标题】:OnClickListener on Views inside a custom ScrollViewOnClickListener 在自定义 ScrollView 内的视图上
【发布时间】:2014-01-15 15:55:01
【问题描述】:

我在 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 时,他们的OnClickListeners 将不会被调用。

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

如何在ScrollView 中放置可点击的视图?

编辑:在实现 Rotem 的答案后,onClickListener 有效,但它不仅会触发点击事件,还会触发其他事件,例如投掷。如何预防?

【问题讨论】:

    标签: android


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      在onInterceptTouchEvent我

      return super.onInterceptTouchEvent(p_event);
      

      【讨论】:

      • 如果你只用相同的参数调用super,则不需要重写方法
      • 确保您阅读了Javadoc 以了解您的方法,它描述了您的问题。正如 Rotem 所说,你不需要实现这个。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多