2011-11-04 7 views
2

正しく動作するViewPagerを使用しているプロジェクトがあります。 左右にフリックすることで、ビューからビューにページングできます。"trueを返す"にもかかわらず階層がリークアップするタッチイベント

ViewPagerの1ページにカスタムビューがあり、その下にViewPagerに「ページング」しないタッチセンシティブな別のビュー(LinearLayout)を追加しようとしています。このように:私のビューが膨張し、ViewPagerに追加された後

<LinearLayout > 

    <myView /> 

    <LinearLayout> // The touch sensitive region 
    </LinearLayout> 

</LinearLayout> 

、私は内部のLinearLayoutにリスナーを添付すること)(setOnTouchListenerを呼び出します。リスナーは "true"を返します。

私はそのビューで水平に移動すると不幸にも、別のページに移動します。 イベントは、 ACTION_DOWN、ACTION_MOVE(n回)、そして最後はACTION_CANCELです。私は景色の中にとどまった。

イベントがビュー階層を上ってViewPagerで処理されたようです。

この動作には論理的な説明がありますか?

答えて

2

私は、dispatchTouchEvent()をオーバーライドして、アクティビティレベルでイベントをインターセプトすることで回避策を見つけました。

そこに、ユーザーが私のタッチセンシティブなビューに触れていない限り、すべてのイベントを処理するためにsuper.dispatchTouchEvent()を呼び出します。私は、ユーザーが正しいページに、正しい場所にいるかどうかをテストします。その場合、私はイベントを自分で処理します。

@Override 
public boolean dispatchTouchEvent (MotionEvent ev) { 


    if (pager.getCurrentPosition()!=0) { // Test ViewPager page 
      super.dispatchTouchEvent(ev); 
    } 
    else { 

     int[] xy = new int[2]; 
     findViewById(R.id.myTouchControl).getLocationOnScreen(xy); 
     int topOfView = xy[1]; 

     if (ev.getY() > topOfView) { 
      // Custom processing 
      ... 

     } else { 
      // Standard processing 
      super.dispatchTouchEvent(ev); 
     } 
    } 
    return false; 
} 
2

dispatchTouchEvent()をオーバーライドする必要はありません。代わりに、ACTION_DOWNイベントでView.getParent().requestDisallowInterceptTouchEvent(true)を使用してください。

requestDisallowInterceptTouchEvent(true)は、この特定のタッチイベントを代行受信しないように親ビュー(ViewPager)をリクエストします。これは、MotionEventが終了した後にこのフラグをクリアするため、ACTION_DOWNで呼び出す必要があります。

+0

ありがとうございます –

関連する問題