メニューとしてを持っているアプリを開発してViewPager
います。それぞれには、、 、 などfragment
の子ビューがたくさんあります。そのうちの 1 つには、設定パネル (ラッパー)といくつかの(ボタン) を子として切り替える設定ボタンがあります。この設定パネルは、上下にスライドするアニメーション (閉じたとき) でアニメーション化されており、表示されている場合はページングを無効にします。ListView
ScrollView
LinearLayout
fragments
LinearLayout
ScrollView
LinearLayout
SeekBar
ViewPager
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!pagingEnabled && event.getAction() == MotionEvent.ACTION_MOVE) {
return true;
}
return super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (!pagingEnabled && event.getAction() == MotionEvent.ACTION_MOVE) {
return true;
}
return super.onInterceptTouchEvent(event);
}
public boolean isPagingEnabled() {
return pagingEnabled;
}
public void setPagingEnabled(boolean pagingEnabled) {
this.pagingEnabled = pagingEnabled;
}
しかし、これには問題がありました。パネルが起動するたびに、すべての子ビューが を受信しないため、OnTouchEvent
を追加しましたGestureDetector.SimpleOnGestureListener
:
protected class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.i(C.TAG, "distanceX " + distanceX + " distanceY " + distanceY);
return Math.abs(distanceY) < Math.abs(distanceX);
}
}
そして私ViewPager
onInterceptTouchEvent
を次のように変更しました:
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (!pagingEnabled && event.getAction() == MotionEvent.ACTION_MOVE && (mGestureDetector != null && mGestureDetector.onTouchEvent(event))) {
return true;
}
return super.onInterceptTouchEvent(event);
}
これは機能し、パネル ボタンは onClick や ListView スワイプなどを受け取りますが、それほどMath.abs(distanceY) < Math.abs(distanceX)
正確ではないため、これは完璧には機能しません。上下または斜めにすばやくスワイプするか、マイナースワイプでボタンに触れると、onInterceptTouchEvent
も戻るtrue
ため、mGestureDetector.onTouchEvent(event)
戻りtrue
ます。
いくつかのグーグル検索の後、私はこれに出くわしました:
viewPager.requestDisallowInterceptTouchEvent(true);
そして、私は次のようなことを試しました:
myListView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
viewPager.requestDisallowInterceptTouchEvent(true);
return false;
}
});
ViewPager.onInterceptTouchEvent
そして、それは最初に呼び出されMotionEvent.ACTION_DOWN
、その後myListView.setOnTouchListener
すぐに呼び出され、残りのMotionEvent
アクション (MOVE および UP) を許可しないため、非常にうまく機能しViewPager
ますListView
。
しかし、まだ問題が残っています。これrequestDisallowInterceptTouchEvent(true)
をすべての子ビューに追加する必要onTouchEvent
があり、エレガントなコードではありません。
だから私の質問は、私は正しい道を進んでいますか?このリスナーをすべてのパネルの子ビューに追加しないようにする方法はありますか (もちろん、必要な場合は最も一般的な方法で行います)。
御時間ありがとうございます。