2013-04-15 5 views
9

ViewPager内の水平ScrollViewを使用しています。カスタムScrollView内のビュー上の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は、その内部にそのビューとすべてに任意のクリックを消費しているようだ:。ScrollViewの端が、私はSOにヒントに従って、このクラスを使用する達したときにスクロールするViewPagerを防ぐために、 ViewsScrollViewに入れると、OnClickListenerは呼び出されません。

onInterceptTouchEventをfalseにすると、OnClickListenerが呼び出されますが、ScrollViewはスクロールできません。

クリック可能なビューをその中に入れるにはどうすればよいですかScrollView

編集:Rotemの回答を実装した後、onClickListenerは機能しますが、クリックイベントだけでなく、他のもの、たとえば飛行機のようにも発動しません。どのようにこれを防ぐことができますか?

答えて

5

まあ、私はそれがどのように動作するかを発見恵み開始後分:私はここに

onInterceptTouchEvent
return super.onInterceptTouchEvent(p_event); 
+2

をあなただけの同じ引数でスーパーを呼び出す場合、メソッドをオーバーライドする必要はありませんあなたは[Javadocの](http://developer.android.com/を読んで確認してください – Rotem

+0

あなたの問題を説明しているメソッドのリファレンス/アンドロイド/ビュー/ 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); 
     } 

} 
関連する問題