Как я могу программно отключить все пункты меню в моей деятельности - PullRequest
1 голос
/ 16 декабря 2009

В андроид я создаю свой пункт меню, как это?

public boolean onCreateOptionsMenu(Menu menu) {

        menu.add(0, 0, 0, "Menu1");
        menu.add(0, 1, 0, "Menu2");
        return true;
}

Как я могу сделать все пункты меню отключенными программным способом (в другой части кода в моей деятельности, а не в самом методе onCreateOptionsMenu ())?

Спасибо.

Ответы [ 5 ]

9 голосов
/ 16 декабря 2009

Вы можете использовать groupId, который вы установили, чтобы отключить / включить все пункты меню одновременно, используя menu.setGroupEnabled(). Так, например, поскольку вы добавили элементы в группу 0, вы должны сделать:

menu.setGroupEnabled(0, false);

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

6 голосов
/ 16 декабря 2009

add возвращает MenuItem (который вы также можете извлечь из объекта Menu), который можно сохранить в переменной.

MenuItem menu1;

public boolean onCreateOptionsMenu(Menu menu) {
    menu1 = menu.add(0, 0, 0, "Menu1");
}

public void someOtherMethod() {
    if(menu1 != null) {
        // if it's null, options menu hasn't been created, so nevermind
        menu1.setEnabled(false);
    }
}
5 голосов
/ 01 марта 2013

Я предпочитаю полностью их скрывать, если они не должны использоваться (вместо того, чтобы отключать их). Для этого я делаю:

menu.clear();

и воссоздать его:

invalidateOptionsMenu();

Это также работает для пунктов меню, добавленных из фрагментов.

2 голосов
/ 11 августа 2016

Если все еще актуально:

public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    for(int i=0; i<menu.size(); i++){
        menu.getItem(i).setEnabled(isMenuEnabled);
    }
}

и вызову invalidateOptionsMenu (), затем isMenuEnabled изменилось

0 голосов
/ 13 мая 2019

Если у вас есть несколько случаев, когда вы хотите что-то сделать с всеми пунктами меню (например, изменить состояние «отмечено»), есть элегантное решение, использующее свойства расширения Kotlin: (Здание поверх ответа Валерия )

В одном месте определите свойство 'items' из android.view.Menu:

import android.view.Menu
import android.view.MenuItem

val Menu.items: List<MenuItem>
get() {
    val items = mutableListOf<MenuItem>()
    for (i in 0 until this.size()) {
        items.add(this.getItem(i))
    }
    return items
}

Теперь вы можете использовать его в любом меню:

anyMenu.items.forEach { it.isEnabled = false }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...