問題
スワイプ ジェスチャで ListView アイテムの「コンテキスト アクション」を開発しているときに、Android が MotionEvents を ViewGroup の子にディスパッチする方法について少し混乱しました。
ドキュメントによると、すべてのことはViewGroupd.dispatchTouchEvent(MotionEvent)
メソッド呼び出しから始まります。次に、ビュー グループは、特定のモーション イベントをインターセプトする必要があるかどうか、またはそれを子にディスパッチできるかどうかを尋ねます。これはあらゆる種類のスクロールでうまく機能するため、垂直スクロールと水平スクロールの間の競合を効率的に解決できます (たとえば、ViewPager 内の ListView)。
ただし、この方法ではリスト ビューで単純なクリック イベントを正常に処理できません。モーション イベントのディスパッチ トレースは次のようになります
ListView.dispatchTouchEvent(DOWN)
ListView.onInterceptTouchEvent(DOWN)
戻りますfalse
。QuickActionView.dispatchTouchEvent(DOWN)
QuickActionView.onTouchEvent(DOWN)
MotionEvent.ACTION_DOWNtrue
はジェスチャの開始を示しており、水平スクロールである可能性があり、この場合はユーザーにクイック アクション レイアウトを表示する必要があるため、戻ります。false
ここから戻るMotionEvent.ACTION_DOWN
と、他のタッチ イベントが ListView のこの子にディスパッチされるのを防ぎます。- ステップ4の
QuickActionView.dispatchTouchEvent(DOWN)
返品によるtrue
- ステップ5の
ListView.dispatchTouchEvent(DOWN)
返品によるtrue
その結果、ListView はタッチ ターゲットを記憶します。したがって、次のメッセージはこのようにディスパッチされます。
ListView.dispatchTouchEvent(UP)
ListView.onInterceptTouchEvent(UP)
戻りますfalse
。QuickActionView.dispatchTouchEvent(UP)
QuickActionView.onTouchEvent(UP)
false
ジェスチャが終了し、スクロールやフリングなどではないことがわかったので、戻ります。- ステップ4の
QuickActionView.dispatchTouchEvent(UP)
返品によるfalse
- ステップ5の
ListView.dispatchTouchEvent(UP)
返品によるfalse
onTouchEvent(MotionEvent)
そのため、ListView が項目のクリックを処理する機会はありません。これは、ステップ 5 の UP アクションの後、モーション イベントが ListView のメソッドに向けられていないためです。
また、ListView 内で ACTION_UP を使用してタッチ イベントを「インターセプト」しようとしましたが、Android のドキュメントによると、インターセプト後のモーション イベントのみが ViewGroup のonTouchEvent(MotionEvent)
メソッドに送信され、現在のイベントは送信されないことに気付きました。
質問
ListView のネイティブ アイテム クリック処理と、MotionEvents を ListItem ビューにディスパッチする機能の両方をサポートするにはどうすればよいですか (水平スクロール可能で、画像ボタンがあります)。
そのような問題解決の経験がある人から話を聞くか、特定の紛争解決でどのように機能するように設計されているかについてより深い理解を持っていることが望ましいです。