7

私は ActionBarSherlock-4.1.0-0 を使用しています。ハードウェア メニュー ボタンを使用してアクションバーのサブメニューを開きたいと思います。更新を計画していますが、古いバージョンでは「通常」メニューを使用していました。ユーザーが新しいデザインに慣れるのを手伝いたい.

サブメニューとメインメニューを取得しました:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater i = getSupportMenuInflater();
    i.inflate(R.menu.main_menu, menu);
    SubMenu subMenu = (SubMenu) menu.findItem(R.id.actionbar_submenu);
    Menu mainMenu = menu;
    return super.onCreateOptionsMenu(menu);
}

そして、ハードウェア メニュー ボタンのリスナーを取得しました。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch(keyCode) {
        case KeyEvent.KEYCODE_MENU:
            // TODO: expand submenu from actionbar
            return true;

        }
    }
    return super.onKeyDown(keyCode, event);
}

呼び出すメソッドやその他のものが見つかりませんでした。

4

3 に答える 3

11

Androidアクションバーを使用してFrederikのこのソリューションを試してみると、サブメニューがすぐに開いて閉じるという問題に遭遇しました。onKeyUp に変更すると、この問題は解決しました。

これが私のコードです:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_MENU){
        if (event.getAction() == KeyEvent.ACTION_DOWN && optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null)
        {
            Log.i(TAG, "performIdentifierAction");
            optionsMenu.performIdentifierAction(R.id.sub_menu, 0);
            return true;
        }
    }
    return super.onKeyUp(keyCode, event);
}

optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != nullアクションバーのない古い Android バージョンとの互換性の問題が原因かどうかを確認します。すべてのバージョンで ActionBarSherlock を使用する場合、これは必要ありません。

于 2012-11-20T14:19:04.190 に答える
4

私は常に Fredrik Sundmyhr のソリューションで NullPointerException を取得していましたが、いくつか変更したところ、うまくいきました。これが私の解決策です:

@Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_UP){
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_MENU:
                SubMenu subMenu = mainMenu.getItem(2).getSubMenu();
                mainMenu.performIdentifierAction(subMenu.getItem().getItemId(), 0);

                return true;  
            }
        }
        return super.onKeyUp(keyCode, event);
    }
于 2012-10-07T19:39:18.600 に答える
4

これが私が問題を解決した方法です

mainMenu.performIdentifierAction(id_of_menu_item, 0);

だからあなたの場合、私はそれがこのようになると想像します

private Menu mainMenu; // local variable for menu

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater i = getSupportMenuInflater();
    i.inflate(R.menu.main_menu, menu);
    SubMenu subMenu = (SubMenu) menu.findItem(R.id.actionbar_submenu);
    mainMenu = menu; // store the menu in an local variable
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch(keyCode) {
        case KeyEvent.KEYCODE_MENU:
            SubMenu subMenu = (SubMenu) mainMenu.findItem(R.id.actionbar_submenu);
            mainMenu.performIdentifierAction(subMenu.getItem().getItemId(), 0);

            return true;  
        }
    }
    return super.onKeyDown(keyCode, event);
}

要するに:

  • メニューをローカル変数に保存する
  • その変数を使用してサブメニューを探します
  • その変数を使用してperformIdentifierActionメソッドを呼び出します

うまくいけば、これはうまくいくでしょう。

于 2012-07-24T18:01:07.403 に答える