Попытка скрыть и отобразить пункты меню на панели действий

Я просмотрел вопросы о переполнении стека и не могу найти решение.

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.themenu, menu);
    MenuItem   item = menu.findItem(R.id.menu_settings);
    MenuItem item2 = menu.findItem(R.id.menu_save);
    item.setVisible(isdown);
    item2.setVisible(isdown);
    return true;
}

Это позволяет отображать пункты меню (item1 и item2). onclick отлично работает

public void inflateTextarea() {
    if(isdown == true) {
        isdown = false;
        LinearLayout tl = (LinearLayout)findViewById(R.id.content);
        tl.setVisibility(View.VISIBLE);
        ScaleAnimation scale =  new ScaleAnimation(1, 1, 0, 1);
        scale.setFillAfter(true);
        scale.setDuration(500);
        tl.startAnimation(scale);
    }
}

Затем это устанавливает мой isdown логический в false. на стеке люди говорят, что onPrepareOptionsMenu должен стрелять каждый раз, когда я нажимаю, но это не так. Я могу скрыть один пункт меню в функции onclick

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case R.id.menu_settings: 
            Log.v("Log:","edit_item pressed");
            return true;
    }
}

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

Ответ 1

Недостаточно изменить переменную isDown. Вы должны вызвать метод setVisible() каждый раз, когда хотите изменить видимость. Этот метод не просто устанавливает логическое значение, поэтому простое изменение логического значения не будет выполняться.

После изменения значения isDown на значение false вам нужно вызвать invalidateOptionsMenu(), который запустит меню повторно, снова позвонив onPrepareOptionsMenu().

Попробуйте этот код, чтобы сделать пункты меню невидимыми:

...
isdown = false;
invalidateOptionsMenu();
...

Ответ 2

Попробуйте это,

private Menu menu=null;
@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater)
{
    inflater.inflate(R.menu.note_menu, menu);
    this.menu=menu;
super.onCreateOptionsMenu(menu,inflater);
menu.findItem(R.id.menuChartNoteEdit).setVisible(isdown);
menu.findItem(R.id.menuChartOpenNote).setVisible(isdown);
}

Если вы хотите скрыть меню в любом месте, после выполнения onCreateOptionsMenu() затем просто измените значение для isdown и повторите этот код,

menu.findItem(R.id.menu_settings).setVisible(isdown);
menu.findItem(R.id.menu_save).setVisible(isdown);

Ответ 3

Попробуйте это в своем FragmentActivity

public boolean onPreparePanel(int featureId, View view, Menu menu) {
    if(isLeftMenuOpened()) return false;
    return super.onPreparePanel(featureId, view, menu);
}

Метод FragmentActivity.onPreparePanel создает меню для всех прикрепленных фрагментов. Вы должны вернуть true для отображаемого меню; если вы вернете false, оно не будет показано.

Ответ 4

У меня есть меню с двумя элементами, сначала: сохранить элемент, второй: отредактировать элемент. Я хотел, чтобы, когда я вошел, чтобы редактировать, сначала "сохранить элемент" был скрыт, и когда я нажимаю "редактировать элемент", отображается "сохранить элемент".

Итак:

  • объявить объект публично
  • установить значение в onCreateOptionsMenu(Menu menu, MenuInflater inflater)
  • установить видимость на isHidden()
  • тогда каждый раз, где я хотел, установите видимость на isVisible()

Общая область:

MenuItem saveItem;

onCreateOptionsMenu:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_detail_products, menu);
    saveItem = (MenuItem) menu.findItem(R.id.action_detail_product_save);
    saveItem.setVisible(isHidden());
}

Где я хочу:

saveItem.setVisible(isVisible());

Наконец, он работает так, как я хотел.