Android - Включение элементов меню по коду - PullRequest
4 голосов
/ 18 августа 2010

Мне нужно включить MenuItem, когда возвращается предыдущий экран (Activity).

Я попробовал этот код:

... ((MenuItem) findViewById (R.id.menu_how)) setEnabled (истина). ...

но исключение нулевого указателя запущено.

Кстати, menu_how установлено в false в xml; и код является частью вызова onActivityResult (int requestCode, int resultCode, Intent data).

Ответы [ 4 ]

6 голосов
/ 13 апреля 2011

Я нашел что-то на android dev site , что может быть полезно (смотрите раздел «Изменение пунктов меню во время выполнения»)

В нем говорится, что метод onCreateOptionsMenu() срабатывает толькокогда создается меню для действия, и это происходит, когда начинается это действие.Поэтому, если вы хотите изменить пункты меню после того, как меню / действие было создано, вам нужно переопределить метод onPrepareOptionsMenu().поиск по ссылке для получения полной информации.

РЕДАКТИРОВАТЬ:

Только что сделал и все работает нормально.Я использую один boolean var на menuItem, который представляет, должен ли этот элемент быть включен или нет.Это мой код:

/*************************************Game Menu**************************************/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.game_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) 
    {
        case R.id.gm_new_game:
            //newGame();
            return true;
        case R.id.gm_stand_up:
            //some code when "gm_stand_up" button clicked..
            return true;
        case R.id.gm_forfeit:
            //some code when "gm_forfeit" button clicked..
            return true;
        case R.id.gm_surrender:
            //some code when "gm_surrender" button clicked..
            return true;
        case R.id.gm_exit_table:
            exitTableCommand();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
    menu.findItem(R.id.gm_forfeit).setEnabled(forfeitMenuButtonIsEnabled);
    menu.findItem(R.id.gm_surrender).setEnabled(surrenderMenuButtonIsEnabled);
    menu.findItem(R.id.gm_new_game).setEnabled(newGameMenuButtonIsEnabled);
    menu.findItem(R.id.gm_stand_up).setEnabled(standUpMenuButtonIsEnabled);

    return super.onPrepareOptionsMenu(menu);
}
6 голосов
/ 08 февраля 2012

Попробуйте использовать menu.findItem(R.id.menu_how) в onCreateOptionsMenu и сохраните ссылку для последующего использования.

Это должно нормально работать с enabled, однако я обнаружил, что установка элемента меню на невидимый в XML означаетВы не можете показать / скрыть это программно.

1 голос
/ 19 августа 2010

где вы это называете? (Извините, не читал внимательно) Я думаю, вам нужно вызвать его после того, как меню надулось (обычно в OnCreateOptionsMenu). Чтобы сделать это, вы можете установить для переменной значение true, когда другая активность вернется, затем сделать ((MenuItem)findViewById(R.id.menu_how)).setEnabled(mMyBooleanField) в OnCreateOptionsMenu после вызова inflater.inflate.

Редактировать: чтобы выполнить это в коде, это может выглядеть примерно так:

В верхней части класса (вместе со всеми остальными участниками):
Boolean mEnableMenuItem = false;

В OnCreateOptionsMenu:
MenuInflater inflater = getMenuInflater();<br> inflater.inflate(R.menu.options_main, menu); ((MenuItem)findViewById(R.id.menu_how)).setEnabled(mEnableMenuItem );

В OnActivityResult:
mEnableMenuItem = true;

0 голосов
/ 26 февраля 2015

Сохраняйте ссылку на Меню в своей деятельности:

private Menu mMenu;

Тогда:

public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_note, menu);
        mMenu = menu;
        return true;
    }

Теперь, чтобы получить доступ к пунктам меню в любом месте вашей деятельности, используйте код, подобный следующему:

mMenu.findItem(R.id.menu_how).setVisible(false);

или

mMenu.findItem(R.id.menu_how).setEnabled(true);
...