ほとんどの場合、キーイベントは、現在フォーカスがある(子)ビューによって処理されるようにします。これはデフォルトの動作であり、現在実装しているものでもあります。
ただし、特定の非常に特殊な状況では、現在のアクティビティまたはルートビュー(問題ではない)のいずれかで、すべての主要なイベント(特に子ビューによって通常処理されるイベントを含む)を一時的にインターセプトして処理したいと思います。 、グローバルに処理される限り、ボリューム+/-のようなハードウェアボタンは気にしません。これらはとにかく私の子ビューでは処理されないためです)。
タッチイベントの場合、onInterceptTouchEvent()があります。これにより、ViewGroupは、子ビューにディスパッチされたタッチイベントを監視し、目的の子ビューによるこれらのイベントの受信を(必要に応じて)ブロックできます。
残念ながら、キーイベントのonInterceptTouchEvent()に類似したものは見つかりません。私は明らかな何かを見逃していますか、それともこれはOSの実際の非対称性ですか?
もちろん、すべての子ビューの現在のキーイベントハンドラーコードをワイヤリングして、必要に応じてイベントを処理するメインアクティビティのメソッドを直接呼び出し、そのアクティビティレベルのメソッドがそれを示すブール値を返すようにすることもできます。イベントを処理しました。次に、子ビューは、呼び出したアクティビティメソッドがイベントを処理しなかった場合にのみ、イベントを処理できます。
しかし、onInterceptTouchEvent()がタッチイベントに対して行うのと同じように、階層を子ビューに「下る」途中でトラフィックを単純にインターセプトするよりクリーンな方法があることを望んでいます。