3

ハードウェアのメニューボタンで実行されるロングクリックのリスナーを設定するにはどうすればよいですか? メニューボタンにプログラムでアクセスする方法は何ですか?

さらに、ロングクリックとシングルクリックをどのように区別できますか? (私が知る限り、ロングクリックが実行されたときにシングルクリックイベントも伝播されます-これら2つの状況には2つの異なるアクションが必要なので、これが発生することは望ましくありません。ロングクリックとシングルクリックは別のリスナーですデバイスのメニュー ボタン)

ありがとうございました!

4

1 に答える 1

2

これはかなり簡単です。Android 開発者の Web サイトでKeyEvent.Callbackを確認してください。

onKeyLongPress()そこにはとがonKeyDown()ありますonKeyUp()。これにより、正しい軌道に乗るはずです。さらにヘルプが必要な場合は、コメントするか、コードを投稿してください。

編集:質問を読み直しました。シングル クリックとロング クリックの区別がつかない場合は、クリックの継続時間を使用onKeyDownonKeyUpて確認する必要があります。基本的に、 でタイマーを開始し、onKeyDownで時間を確認しonKeyUpます。を監視する必要がありFLAG_CANCELEDます。

さらに編集:いくつかのテストを行う時間を見つけました。このコードは、必要なことを行う必要があります (onKeyUp()短押しイベントのみをonLongPress()取得し、長押しイベントのみを取得します)。

ここで重要なのはevent.startTracking()onKeyDown()ハンドラーでの呼び出しです。

配置しますActivity(これはカスタムビューでも機能するはずですが、テストされていません):

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        // Handle Long Press here
        Log.i("KeyCheck", "LongPress");
        return true;    
    }
    return super.onKeyLongPress(keyCode, event);
}
@Override   
public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.i("KeyCheck", "KeyDown" + keyCode);
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        event.startTracking(); //call startTracking() to get LongPress event
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU && event.isTracking()
            && !event.isCanceled()) {
        // handle regular key press here
        Log.i("KeyCheck", "KeyUp");
        return true;
    }
    return super.onKeyUp(keyCode, event);
}
于 2012-06-03T03:02:48.590 に答える