Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change options menu during runtime - invalidateOptionsMenu()

Tags:

I am creating a menu where one of the items is used the lock an object. When this item is clicked, the menu should be recreated with a button to unlock the item. I created two menus for this. This is working fine. I read that in Android version >= 11 the onPrepareOptionsMenu is no longer called when displaying the menu and I have to call invalidateOptionsMenu(). So I changed the build target (both in the Manifest and in properties) to 11 and ran the app on an AVD of 4.0.3. The program is still working fine, but I thought it shouldn't anymore, and I should check

if (Build.VERSION.SDK_INT >= 11) {   invalidateOptionsMenu(); } 

This is my code:

public class MainActivity3 extends Activity{      boolean locked;      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);          locked = false;     }        @Override       public boolean onCreateOptionsMenu(Menu menu){             MenuInflater inflater = getMenuInflater();             inflater.inflate(R.menu.changing_menu1, menu);              return true;         }          @Override         public boolean onPrepareOptionsMenu(Menu menu) {              menu.clear();             MenuInflater inflater = getMenuInflater();              if (locked) {                 inflater.inflate(R.menu.changing_menu2, menu);             }             else {                 inflater.inflate(R.menu.changing_menu1, menu);             }          return super.onPrepareOptionsMenu(menu);         }          public boolean onOptionsItemSelected(MenuItem item) {             switch (item.getItemId()) {            case R.id.Menu1:           break;            case R.id.Menu2 :           break;            case R.id.Menu3 :           locked = !locked;           break;             }         return true;         } } 

So the Menu is still refreshed/recreated in 4.0. Did I misunderstand something about the usage of invalidateOptionsMenu();?

like image 862
erdomester Avatar asked Nov 01 '12 14:11

erdomester


People also ask

What is invalidateOptionsMenu in Android?

invalidateOptionsMenu() is used to say Android, that contents of menu have changed, and menu should be redrawn. For example, you click a button which adds another menu item at runtime, or hides menu items group. In this case you should call invalidateOptionsMenu() , so that the system could redraw it on UI.

What is onOptionsItemSelected() in Android?

If your activity includes fragments, the system first calls onOptionsItemSelected() for the activity then for each fragment (in the order each fragment was added) until one returns true or all fragments have been called.


1 Answers

invalidateOptionsMenu() was added to give us the ability to force onCreateOptionsMenu() to be called again. onPrepareOptionsMenu() is still called every time you call the menu.

What you are trying to achieve above is a good example of when to use invalidateOptionsMenu() but because of backwards compatibility you will need to do both:

if (Build.VERSION.SDK_INT >= 11) {   invalidateOptionsMenu(); }   @Override public boolean onCreateOptionsMenu(Menu menu){     if (Build.VERSION.SDK_INT >= 11) {         selectMenu(menu);     }     return true; }  @Override public boolean onPrepareOptionsMenu(Menu menu) {     if (Build.VERSION.SDK_INT < 11) {         selectMenu(menu);     }     return true; }  private void selectMenu(Menu menu) {     menu.clear();     MenuInflater inflater = getMenuInflater();      if (locked) {         inflater.inflate(R.menu.changing_menu2, menu);     }     else {         inflater.inflate(R.menu.changing_menu1, menu);     } } 
like image 79
JustinMorris Avatar answered Nov 09 '22 09:11

JustinMorris