2つのフラグメントのビューページャーがあります。これらのフラグメントの1つには、X軸でのonTouchの変更をリッスンするレイアウト魔女があります。
レイアウトは、X軸に沿って触れたりスライドしたりすると、ほとんどすべてのAction.Moveイベントを取得しません。 viewpagerにはtrueを返すonInterceptTouchEventがあるようです。
それと私のレイアウトを一緒に機能させるために、viewpagerの動作をオーバーライドするのは本当ですか?したがって、完璧な状況は、レイアウトがその上のすべてのonTouchイベントをインターセプトし、viewpagerが残りのonTouchイベントを管理することです。ありがとう!
正解です。すべてのスクロールコンテナーがタッチイベントをインターセプトすると思いますが、それを防ぐことができます。あなたのレイアウトにタッチリスナーを置くことができます:
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;
}
}
同様の状況(ただし、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);
}
}
ニュートリノは正しかった!
getParent().requestDisallowInterceptTouchEvent(true);
ビューページャーがtouchEvent Interceptにアクセスすると、その子ビューがイベントを取得できます。 ここに画像の説明を入力
ViewpagerでFrameLayoutを使用してDrawerLayoutエフェクトを取得します(画面の高さと一致させる必要がないため、drawerlayoutやナビゲーションドロワーを使用できません)。
それは本当に役立ちます!