13

ほとんどの場合、キーイベントは、現在フォーカスがある(子)ビューによって処理されるようにします。これはデフォルトの動作であり、現在実装しているものでもあります。

ただし、特定の非常に特殊な状況では、現在のアクティビティまたはルートビュー(問題ではない)のいずれかで、すべての主要なイベント(特に子ビューによって通常処理されるイベントを含む)を一時的にインターセプトして処理したいと思います。 、グローバルに処理される限り、ボリューム+/-のようなハードウェアボタンは気にしません。これらはとにかく私の子ビューでは処理されないためです)。

タッチイベントの場合、onInterceptTouchEvent()があります。これにより、ViewGroupは、子ビューにディスパッチされたタッチイベントを監視し、目的の子ビューによるこれらのイベントの受信を(必要に応じて)ブロックできます。

残念ながら、キーイベントのonInterceptTouchEvent()に類似したものは見つかりません。私は明らかな何かを見逃していますか、それともこれはOSの実際の非対称性ですか?

もちろん、すべての子ビューの現在のキーイベントハンドラーコードをワイヤリングして、必要に応じてイベントを処理するメインアクティビティのメソッドを直接呼び出し、そのアクティビティレベルのメソッドがそれを示すブール値を返すようにすることもできます。イベントを処理しました。次に、子ビューは、呼び出したアクティビティメソッドがイベントを処理しなかった場合にのみ、イベントを処理できます。

しかし、onInterceptTouchEvent()がタッチイベントに対して行うのと同じように、階層を子ビューに「下る」途中でトラフィックを単純にインターセプトするよりクリーンな方法があることを望んでいます。

4

3 に答える 3

0

すべてのウィジェット/ビューは実装されKeyEvent.Callbackているようです。これには、キーダウン、長押し、複数回、およびキーアップのために呼び出されるメソッドがあります。これらのメソッドはすべて、次のように説明されるブール値を返します。

イベントを処理した場合は、trueを返します。イベントが次の受信者によって処理されることを許可する場合は、falseを返します。

親コンポーネントでこれらのメソッドをオーバーライドしてみることができると思います。

もう1つはdispatchKeyEvent()Viewフォーカスパスに沿ってイベントをディスパッチする処理です。これをオーバーライドすることもできます。

于 2013-02-15T08:45:05.697 に答える
0

無効にする s の祖先である でオーバーライドdispatchKeyEventすると機能します。ViewGroupView

以下を使用しています〜。

public static class TvPrefsContainer extends FrameLayout {
    private boolean isActive; // i.e. will dispatch keyboard events to focused children
    // snip

    @Override public boolean dispatchKeyEvent(KeyEvent event) {
        return isActive && super.dispatchKeyEvent(event);
    }
}

public static class TvPrefs extends PreferenceFragment {
    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.tv_prefs);
    }
}

private void togglePrefsVis() {
    tvPrefsContainer.animate()
            .alpha(isPrefsVisible ? 0 : 1)
            .translationX(isPrefsVisible ? tvPrefsContainer.getMeasuredWidth() : 0)
            .start();
    tvPrefsContainer.isActive = isPrefsVisible;
    isPrefsVisible = !isPrefsVisible;
}
于 2014-12-02T01:17:28.487 に答える