Pumpkin
Pumpkin

Reputation: 319

Weird behavior when calling invalidateOptionsMenu() in Android 4.3

I have a menu with three items, each one is shown alone with a screen. I call invalidateOptionMenu() in the second screen to refresh the action bar color. The color change does work pretty well in both 4.1.2 and 4.3 versions.

But on Android 4.3, when I call this, the item of the first screen is shown on the second screen.

Here is my code this is in (@Override public void onClick(View v):

                if (android.os.Build.VERSION.SDK_INT >= 11){
                final ActionBar actionBar = getActionBar();
                this.invalidateOptionsMenu();
                actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor(couleur)));

            }

and even if I try that after it doesn't work:

            final MenuItem saveNote = Menu.findItem(R.id.saveNote);
            final MenuItem removeNote = Menu.findItem(R.id.deleteNote);
            final MenuItem nouvelleNote = Menu.findItem(R.id.nouvelleNote);

            nouvelleNote.setVisible(false); //screen 1
            saveNote.setVisible(true); //screen 2
            removeNote.setVisible(false); //screen 3

And here is how I override onCreateOptionsMenu:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        Menu = menu;
        getMenuInflater().inflate(R.menu.pumpkin_note, menu);

        final MenuItem saveNote = Menu.findItem(R.id.saveNote);
        final MenuItem removeNote = Menu.findItem(R.id.deleteNote);
        final MenuItem nouvelleNote = Menu.findItem(R.id.nouvelleNote);

        nouvelleNote.setVisible(true);
        saveNote.setVisible(false);
        removeNote.setVisible(false);

        return true;
    }

Upvotes: 0

Views: 582

Answers (1)

Georgy Gobozov
Georgy Gobozov

Reputation: 13731

In onCreateOptionsMenu you should just inflate your menu

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

in onPrepareOptionsMenu you should change menu items visibility by some condition

public boolean onPrepareOptionsMenu(Menu menu) {    
            menu.findItem(R.id.saveNote).setVisible(isFirstScreen);
            menu.findItem(R.id.deleteNote).setVisible(isSecondScreen);;
            menu.findItem(R.id.nouvelleNote).setVisible(isThirdScreen);;
    }   

To update your menu you should call invalidateOptionMenu(), this calls onPrepareOptionsMenu and menu redraw again

Upvotes: 1

Related Questions