Trying to hide and show menu items on action bar

28,710

Solution 1

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

Solution 2

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);
Share:
28,710
Dnaso
Author by

Dnaso

What I am good at: Objective-C PHP JavaScrpipt Java HTML/CSS Video Streaming Linux Scripting

Updated on July 05, 2022

Comments

  • Dnaso
    Dnaso almost 2 years

    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?

  • Dnaso
    Dnaso about 11 years
    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
    Dnaso about 11 years
    i heard the onPrepareOptionsMenu was supposed to be better, do you know what the difference is?
  • Dnaso
    Dnaso about 11 years
    ok so now i can put my menu.find item in any function in my class?
  • tbkn23
    tbkn23 about 11 years
    I see. Edited post to cover this.
  • Sino Raj
    Sino Raj about 11 years
    yes, find Menu Item in any where on your class and hide/show..!, Are you check that?
  • Dnaso
    Dnaso about 11 years
    AHHH thats what I was looking for. I will try if it works ill accept thank you.
  • Dnaso
    Dnaso about 11 years
    i will try it out if it works will up vote thank you so much give me a few hours
  • Dnaso
    Dnaso about 11 years
    where do i add the invalidateOptionsMenu() method?
  • tbkn23
    tbkn23 about 11 years
    Anywhere within the activity after you change the value of isDown to false
  • Dnaso
    Dnaso about 11 years
    both worked but the other answer by invalidating the menu is more efficient thank you.
  • Dnaso
    Dnaso about 11 years
    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
  • Muhammad Babar
    Muhammad Babar over 9 years
    invalidateOptionsMenu(); requires API 11. also to hide/show one item i don't think its good option to invalidate whole options menu!