Android: изменение пунктов меню параметров программно - PullRequest
80 голосов
/ 20 августа 2011

Можно ли программно изменить пункты меню?Кто-нибудь может дать мне пример, пожалуйста?

Кроме того, я хочу отключить некоторые элементы, чтобы они не слушали щелчки, это возможно?

Ответы [ 12 ]

199 голосов
/ 28 июля 2012

Для кого-либо необходимо динамически изменять параметры меню:

private Menu menu;

// ...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.options, menu);
    return true;
}

// ...

private void hideOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(false);
}

private void showOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(true);
}

private void setOptionTitle(int id, String title)
{
    MenuItem item = menu.findItem(id);
    item.setTitle(title);
}

private void setOptionIcon(int id, int iconRes)
{
    MenuItem item = menu.findItem(id);
    item.setIcon(iconRes);
}
31 голосов
/ 20 августа 2011

menu.xml

  <item 
    android:id="@+id/item1"
    android:title="your Item">
  </item>

положить в ваш файл Java

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}
16 голосов
/ 15 ноября 2012

Как Николай сказал, сделайте это в onPrepareOptionsMenu ().

Для пунктов меню в панели действий вы должны сделать меню недействительным с помощью activity.invalidateOptionsMenu();

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

7 голосов
/ 28 января 2013

Чтобы отключить определенные элементы:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);
7 голосов
/ 20 августа 2011

Если мне нужно изменить содержимое меню опций, я выполняю его во время onMenuOpened (). Это позволяет мне проверить рабочее состояние в тот самый момент, когда пользователь обращается к меню.

public boolean onMenuOpened(int featureid, Menu menu)
    {
        menu.clear();
        if (!editable)
        {
            MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
            MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
            MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
            itemAdd.setShortcut('0', 'a');
            itemMod.setShortcut('1', 'm');
            itemDel.setShortcut('2', 'd');
        }
        else
        {
            MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
            itemSave.setShortcut('0', 'S');
        }


        return true;
    }
4 голосов
/ 25 ноября 2016

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

getActivity().invalidateOptionsMenu();

Попробуйте эту работу, как обаяние для меня.

3 голосов
/ 30 декабря 2015

Попробуйте этот код:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu=menu;
    updateMenuItems(menu);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.document_list_activity_actions, menu);
    return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    if (item.getItemId() == android.R.id.home) {
        onHomeButtonPresssed();
    }else if (item.getItemId() == R.id.action_delete) {
        useCheckBoxAdapter=false;
        deleteDocuments();
    } else if (item.getItemId() == R.id.share) {
        useCheckBoxAdapter=false;
        shareDocuments();
    } else if (item.getItemId() == R.id.action_tick) {
        useCheckBoxAdapter=true;
        onShowCheckboxes();
    }
    updateMenuItems(menu);
    return true;
}

private void updateMenuItems(Menu menu){
    if (useCheckBoxAdapter && menu != null) {
        menu.findItem(R.id.action_delete).setVisible(true);
        menu.findItem(R.id.share).setVisible(true);
        menu.findItem(R.id.action_tick).setVisible(false);
    } else {
        menu.findItem(R.id.action_delete).setVisible(false);
        menu.findItem(R.id.share).setVisible(false);
        menu.findItem(R.id.action_tick).setVisible(true);
    }
    invalidateOptionsMenu();
}
2 голосов
/ 30 октября 2013

Вы можете сделать что-то простое, как я.Просто измените текст на то, что необходимо при касании пункта меню.Мне нужно было включить и выключить звук, плюс возможность выполнять действие, касаясь его.Вот мой код:

    @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.audioOn:
        audioOn = !audioOn;
        if (audioOn)
            item.setTitle("Audio Off");
        else
            item.setTitle("Audio On");
        return true;

    case R.id.touchOn:
        touchOn = !touchOn;
        if (touchOn)
            item.setTitle("Touch Off");
        else
            item.setTitle("Touch On");
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

audioOn и touchOn - это логические значения, проверенные в других частях кода.Надеюсь, это поможет.

1 голос
/ 14 апреля 2017

Если у вас есть BottomBar:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) {
        getMenuInflater().inflate(R.menu.more_menu, menu);
    }

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.preferences:
            startActivity(new Intent(this, PreferenceActivity.class));
            break;
    }

    return super.onOptionsItemSelected(item);
}

Тогда вам просто нужно позвонить:

@Override
public void onBottomBarClick(int tabId) {
    supportInvalidateOptionsMenu();
}
0 голосов
/ 05 апреля 2019
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calendar, menu);
        if(show_list == true) {         

        if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);

        return true;
    }
...