12

I have looked through the questions on stack overflow and can't find the solution.

@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;
}

This sets my menu items to visible (item1 and item2). the onclick works fine

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);
    }
}

Then this sets my isdown boolean to false. on stack people say that the onPrepareOptionsMenu should fire everytime I click but this is not the case. I am able to hide one menu item on the onclick function

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

But I have multiple menu items that I need to hide and others that I want to show. how can I go about this?

tshepang
  • 12,111
  • 21
  • 91
  • 136
Dnaso
  • 1,335
  • 4
  • 22
  • 48

4 Answers4

19

Its not enough to change the isDown variable. You have to call the setVisible() method every time you want to change the visibility. That method does more than just setting a boolean value, so just changing a boolean value will not do.

After changing the isDown value to false, you need to call invalidateOptionsMenu() which will re-launch the menu by calling onPrepareOptionsMenu() again.

Try this code for making the menu items unvisible:

...
isdown = false;
invalidateOptionsMenu();
...
tbkn23
  • 5,205
  • 8
  • 26
  • 46
  • yes I know that, but as i read the onPrepareOptionsMenu(Menu menu) { is supposed to fire everytime a menu item is clicked and THAT would work. I cant set the visibility unless I have Menu menu in the function, so that is where I am having a problem – Dnaso Apr 19 '13 at 23:27
  • I see. Edited post to cover this. – tbkn23 Apr 20 '13 at 07:14
  • where do i add the invalidateOptionsMenu() method? – Dnaso Apr 20 '13 at 20:28
  • Anywhere within the activity after you change the value of isDown to false – tbkn23 Apr 20 '13 at 20:37
  • nvm found it. i had to add a suppression for new api so i put the invalidation in its own function just incase. thank you – Dnaso Apr 20 '13 at 20:38
  • `invalidateOptionsMenu();` requires API 11. also to hide/show one item i don't think its good option to invalidate whole options menu! – Muhammad Babar Nov 03 '14 at 09:42
11

Try this,

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);
}

When you want to hide menu at any where, after executing onCreateOptionsMenu() then just change value for isdown and repeat this code,

menu.findItem(R.id.menu_settings).setVisible(isdown);
menu.findItem(R.id.menu_save).setVisible(isdown);
Sino Raj
  • 6,431
  • 2
  • 22
  • 23
0

Try this in your FragmentActivity

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

Method FragmentActivity.onPreparePanel creates menu for all attached fragments. You must return true for the menu to be displayed; if you return false it will not be shown.

user1275972
  • 131
  • 1
  • 8
0

I have a menu with two items, first: save item, second: edit item. I wanted when I came in to edit, at first "save item" had been hidden, and when I click "edit item", "save item" was shown.

So:

  1. declare an item in public
  2. set value to it in onCreateOptionsMenu(Menu menu, MenuInflater inflater)
  3. set visibility to isHidden()
  4. then every where I wanted, set visibility to isVisible()

Public region:

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());
}

Where i want:

saveItem.setVisible(isVisible());

Finally it works as I wanted.

user812786
  • 4,302
  • 5
  • 38
  • 50
mortezahosseini
  • 167
  • 1
  • 13