3

私は次のことを行う簡単なアプリを持っています:

public void onClick(View v){

    switch(v.getId()) {     
        case R.id.buttonup:
            onButtonUp();
            break;

        case R.id.buttondown:
            onButtonDown();
            break;
    }

}

public boolean dispatchKeyEvent(KeyEvent event){
        int keyCode = event.getKeyCode();
        switch (keyCode) {

        case KeyEvent.KEYCODE_VOLUME_UP:
             onButtonUp();
             return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            onButtonDown();
            return true;

        default:
            return super.dispatchKeyEvent(event);

        }

    }

void onButtonUp(){
    increment_some_static_class_variable;
}

void onButtonUp(){
    decrement_some_static_class_variable;
}

問題は、音量ボタンを押すたびに、onButtonUp および onButtondown 関数が 2 回呼び出されることです。これは、画面のボタン (onClick(View) で処理) を押しても発生しません。この問題を抱えている人を見つけられなかったので、ここにいる人たちに尋ねています。私は Android が初めてで、これが私の最初のアプリケーションです。ログを使用すると、onButtonUp と onButtonDown の両方の呼び出しが dispatchKeyEvent 関数から来ていることがわかりました。ここで何が問題なのですか?問題をうまく説明できれば幸いです。提案/解決策は大歓迎です。

4

1 に答える 1

5

KeyEvent は複数のアクション、具体的には ACTION_DOWN と ACTION_UP の両方を表すことができます。dispatchKeyEvent コールバックでアクションをチェックしていないため、音量ボタンの DOWN イベントと UP イベントの両方に対してボタン クリック メソッドを呼び出しています。このようにしてみてください:

public boolean dispatchKeyEvent(KeyEvent event){
    int keyCode = event.getKeyCode();
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch (keyCode) {

            case KeyEvent.KEYCODE_VOLUME_UP:
                 onButtonUp();
                 return true;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                onButtonDown();
                return true;

            default:
                return super.dispatchKeyEvent(event);
        }
    }
}
于 2013-04-03T02:59:52.860 に答える