問題は、Android がタッチ イベントを処理する操作の順序です。各タッチ イベントは次のパターンに従います (簡略化された例)。
- Activity.dispatchTouchEvent()
- ViewGroup.dispatchTouchEvent()
- View.dispatchTouchEvent()
- View.onTouchEvent()
- ViewGroup.onTouchEvent()
- Activity.onTouchEvent()
ただし、イベントは、消費されるまでチェーンをたどるだけです(誰かがonTouchEvent()
またはリスナーから true を返すことを意味します)。画面のどこかをタッチしただけでは、誰もそのイベントに興味を示さないため、コードまで流れていきます。ただし、ボタン (またはその他のクリック可能View
) の場合は、関心があるためタッチ イベントを消費するため、フローは 4 行目で停止します。
アクティビティに入るすべてのタッチを監視する場合は、アクティビティが最後に呼び出され、他の誰もイベントをキャプチャしない場合にのみ、dispatchTouchEvent()
常に最初に呼び出されるものをオーバーライドする必要があります。onTouchEvent()
ただし、ここでイベントを消費しないように注意してください。そうしないと、子ビューがイベントを取得できず、ボタンをクリックできなくなります。
public boolean dispatchTouchEvent(MotionEvent event) {
int eventaction=event.getAction();
switch(eventaction) {
case MotionEvent.ACTION_MOVE:
reg.setText("hey");
break;
default:
break;
}
return super.dispatchTouchEvent(event);
}
もう 1 つのオプションは、タッチ処理コードをカスタムViewGroup
( などLinearLayout
) に配置し、そのonInterceptTouchEvent()
メソッドを使用して、必要に応じて親ビューが離れてタッチ イベントを処理できるようにすることです。ただし、この操作は新しいタッチ イベントが開始されるまで元に戻すことができないため、注意してください (1 つのイベントを盗むと、すべてを盗むことになります)。
HTH