アンドロイド:どのように私は、メニューボタンにリスナーを設定することができますか?

StackOverflow https://stackoverflow.com/questions/2478418

  •  21-09-2019
  •  | 
  •  

質問

私は電話でMenuボタンを押したときにカスタムアクションをしたい。

これは、ボタンの上にonClickListener(または類似)を設定し、その場合は可能です、どのように?

onCreateOptionsMenuだけボタンが押された最初の時間と呼ばれている - 私はすでにこれを試してみた。

役に立ちましたか?

解決

ユーザーはメニューが表示されることを期待すると、通常は、しかし、あなたはこれらの線に沿って何かを使用することができ、MENUの動作を上書きすべきではありません。

/* (non-Javadoc)
 * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ( keyCode == KeyEvent.KEYCODE_MENU ) {
        Log.d(TAG, "MENU pressed");
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

他のヒント

しかしonPrepareOptionsMenu(..)はたびに呼び出されます。 :)

APPCOMPATのV.22用に更新。+

このフォーラムの中で述べたように、KeyDownは、

と呼ばれていませんKEYCODE_MENUボタン押します。

ソリューションは、このようにdispatchKeyEventを上書きすることです。

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    int keyCode = event.getKeyCode();
    int action = event.getAction();
    boolean isDown = action == KeyEvent.ACTION_DOWN;

    if (keyCode == KeyEvent.KEYCODE_MENU) {
        return isDown ? this.onKeyDown(keyCode, event) : this.onKeyUp(keyCode, event);
    }

    return super.dispatchKeyEvent(event);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if ( keyCode == KeyEvent.KEYCODE_MENU ) {
        // do what you want to do here
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

、Googleの開発者は、このための修正をリリース(または多分それはバグではありません、それは今からこのように動作する)まで、それは動作します。

あなたは使用して、おそらくハック何か「OnMenuOpened」またはいくつかのように、私は実際にそれをお勧めしませんでした。メニューボタンは、だけなので、アプリケーション間の一貫性があり、メニューを表示するために使用されることを想定している。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top