web-dev-qa-db-ja.com

ViewPagerはすべてのx軸のonTouchイベントをインターセプトします。無効にする方法は?

範囲

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

問題

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

質問

それと私のレイアウトを一緒に機能させるために、viewpagerの動作をオーバーライドするのは本当ですか?したがって、完璧な状況は、レイアウトがその上のすべてのonTouchイベントをインターセプトし、viewpagerが残りのonTouchイベントを管理することです。ありがとう!

33

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

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;
    }
}
42
alex.zherdev

同様の状況(ただし、ViewPagerを使用しない)、これをタッチイベントを必要とするビューに配置するとうまくいきました。ユースケースに該当する場合は、ACTION_MOVE以外のモーションイベントのチェックを追加します。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        this.getParent().requestDisallowInterceptTouchEvent(true);
        return true;
    } else {
        return super.onTouchEvent(event);
    }
}
19
Kuffs

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

getParent().requestDisallowInterceptTouchEvent(true);

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


ViewpagerでFrameLayoutを使用してDrawerLayoutエフェクトを取得します(画面の高さと一致させる必要がないため、drawerlayoutやナビゲーションドロワーを使用できません)。
それは本当に役立ちます!

0
GeekLei