34

範囲

2 つのフラグメントのビューページャーがあります。これらのフラグメントの 1 つには、X 軸で onTouch の変更をリッスンするレイアウト ウィッチがあります。

問題

レイアウトは、X 軸に沿ってタッチおよびスライドするときに、ほとんどすべての Action.Move イベントを取得しません。viewpager には true を返す onInterceptTouchEvent があるようです。

質問

ビューページャーの動作をオーバーライドして、ビューページャーと私のレイアウトを連携させるのは本当ですか? したがって、レイアウトがすべての onTouch イベントをインターセプトし、viewpager が残りの onTouch イベントを管理するのが最適な状況です。ありがとう!

4

4 に答える 4

43

そうです、すべてのスクロールコンテナがタッチイベントをインターセプトすると思いますが、それを防ぐことはできます。レイアウトにタッチリスナーを配置できます。

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_MOVE: 
        pager.requestDisallowInterceptTouchEvent(true);
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        pager.requestDisallowInterceptTouchEvent(false);
        break;
    }
}
于 2011-11-14T14:01:02.600 に答える
19

同様の状況(ただしViewPagerを使用していない)で、これをタッチイベントが必要なビューに入れるとうまくいきました。ACTION_MOVEユース ケースに該当する場合を除き、MotionEvents のチェックを追加します。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        this.getParent().requestDisallowInterceptTouchEvent(true);
        return true;
    } else {
        return super.onTouchEvent(event);
    }
}
于 2011-11-14T13:57:51.187 に答える
1

ニュートリノは正しかった!

getParent().requestDisallowInterceptTouchEvent(true);

ビューページャーが touchEvent インターセプトにアクセスすると、その中の子ビューがイベントを取得できます。 ここに画像の説明を入力


ビューページャーで FrameLayout を使用して DrawerLayout Effect を取得します (画面の高さと一致しない必要があるため、drawerlayout やナビゲーション ドロワーは使用できません)。
本当に助かります!

于 2015-10-09T07:38:24.583 に答える
-1

私も同様の問題を抱えていました。

私の場合、OnTouchListenerオンに設定してViewPagerいましたが、タッチを受け取った子が設定されたときにタッチイベントを受信して​​いませんでしたonClick

私が行ったことは、ViewPagerクラスを拡張し、メソッド内でクリックリスナーを呼び出すことでしたが、正常onInterceptTouchEvent(boolean)に機能しました。間違ったイベントを傍受しないように注意してください。

于 2013-01-25T16:09:20.177 に答える