Подтвердить что ты не робот

Как я могу изменить MenuItem в меню опций на Android?

У меня есть меню опций на моем Activity с MenuItem "Пуск". Когда этот MenuItem выбран, я хотел бы изменить меню, чтобы он содержал MenuItem "Стоп" . И, наконец, когда выбрано "Стоп" , я хотел бы вернуться к "Начать".

Вот часть моего кода, который не работает. У меня есть как "Пуск", так и "Стоп" , указанный в mymenu.xml. Я должен, вероятно, удалить "стоп" при создании меню:

public class MyActivity extends Activity {
    private boolean isStarted = false;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        menu.removeItem(R.id.stop);
        inflater.inflate(R.menu.mymenu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.start:
            isStarted = true;
            return true;
        case R.id.stop:
            isStarted = false;
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if(isStarted) {
            menu.removeItem(R.id.start);
            menu.add(R.id.stop);
        } else {
            menu.removeItem(R.id.stop);
            menu.add(R.id.start);
        }
        return true;
    }
}
4b9b3361

Ответ 1

Для этого типа операций я обычно предпочитаю не изменять элементы меню, а просто скрывать те, которые вам не нужны:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    menu.findItem(R.id.start).setVisible(!isStarted);
    menu.findItem(R.id.stop).setVisible(isStarted);
    return true;
}

Ответ 2

Ответ Flygenring верен, но menu.findItem() отстает и вызывает его внутри onPrepareOptionsMenu (меню меню) создает плохой пользовательский интерфейс. Лучше получить объект MenuItem один раз при создании меню, а затем просто вызвать setVisible каждое временное меню на экране:

    MenuItem mDynamicMenuItem;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        // Get dynamic menu item
        mDynamicMenuItem = menu.findItem(R.id.menu_item);
        return true;
    }

    // Prepare the Screen standard options menu to be displayed. This is called right 
    // before the menu is shown, every time it is shown. You can use this method to
    // efficiently enable/disable items or otherwise dynamically modify the contents.
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        // Here is just a good place to update item
        mDynamicMenuItem.setVisible(isVisible);
        return true;
    }

Ответ 3

Вам, вероятно, нужно будет вызвать super.onPrepareOptionsMenu после того, как вы закончите внесение изменений. Из docs:

Производящие классы должны всегда вызывать до базового класса реализация.

Ответ 4

Я получил решение. Вы в основном удаляете MenuItem при вызове removeItem(), также удаляя ссылку. Использование этого кода работает.

private boolean isStarted = false;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case 1:
        isStarted = true;
        return true;
    case 0:
        isStarted = false;
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    if(isStarted) {
        menu.removeItem(1);
        menu.add(0, 0, 0, "Stop");
    } else {
        menu.removeItem(0);
        menu.add(0, 1, 0, "Start");
    }

    return super.onPrepareOptionsMenu(menu);
}

Вам нужно снова создать MenuItem. Это также причина для метки false. На самом деле вам не нужен MenuInflater при создании Menu через код, поэтому также не нужно никакого XML файла меню.

Ответ 5

спасибо за информацию в этом посте, так как она решила мою проблему с ложными ярлыками в моем меню. Мне пришлось немного изменить его и иметь окончательный код, который хорошо работает в следующем, в надежде, что он спасет кого-то еще некоторое время и разочарование. Это немного другое решение, но основное изменение, которое я сделал, это .setVisible для True или False, кроме того, что решение i.shadrins наилучшим образом подходит для моих нужд.

    @Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);

    if(loggedIn) 
    {
        logIn.setVisible(false);
        logOut.setVisible(true);
    } 
    else 
    {
        logIn.setVisible(true);
        logOut.setVisible(false);
    }
    return true;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    logIn = menu.findItem(R.id.loggedOut);
    logOut = menu.findItem(R.id.loggedIn);
    return true;
}