3

サービスから開始され、ハンドラーを介して渡されたサービスからのメッセージに基づいて UI を変更するオプション メニューをアクティビティに作成しようとしています。

オプションメニューを次のように設定しました。


     /** Menu creation and setup **/

        /* Creates the menu items */
        public boolean onCreateOptionsMenu(Menu menu) {
            menu.add(0, 1, 0, "Speaker");
            menu.add(0, 2, 0, "Mute");
            return true;
        }

        /* Handles item selections */
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case 1:
                //Do something here
                return true;
            case 2:
               //Do something here
                return true;
            }
            return false;
        }  

しかし、アプリケーションがまったく実行されているときに呼び出されることはありません。

情報が間違ったスレッドで渡されているため、ハンドラーを使用して画面上のテキストを変更する必要があるという問題を経験しましたが、これと同じ問題が原因でメニューが表示されない可能性がありますか?

ハンドラーのメソッドをオーバーライドできないので、どうすれば修正できますか

4

2 に答える 2

5

キーハンドラーのメニューのキーイベントを消費していないことを確認してください。メニューボタンイベントは、onCreateOptionsMenu関数によって処理される前に、キーハンドラーを介して送信されます。これは、焦点を絞った任意のビューで、またはアクティビティ自体によって発生する可能性があります。これを修正する簡単な方法は次のとおりです。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_MENU)
        return super.onKeyDown(keyCode, event);
    -- insert all other key handling code here --
    return false;
}
于 2010-08-05T14:02:05.490 に答える
2

次のように、オーバーライドされた onCreateOptionsMenu メソッドでスーパー メソッドを呼び出してみてください。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    boolean result = super.onCreateOptionsMenu(menu);
    menu.add(0, 1, 0, "Speaker");
    menu.add(0, 2, 0, "Mute");

    return result;
}
于 2010-08-05T13:52:06.733 に答える