android: changing option menu items programmatically

JavaAndroidOptionMenuitem

Java Problem Overview


Is it possible to change the option menu items programmatically? Can anyone provide me with an example please?

Also, I want to disable certain items, so that they don't listen to the clicks, is it possible?

Java Solutions


Solution 1 - Java

For anyone needs to change the options of the menu dynamically:

private Menu menu;

// ...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.options, menu);
    return true;
}

// ...

private void hideOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(false);
}

private void showOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(true);
}

private void setOptionTitle(int id, String title)
{
    MenuItem item = menu.findItem(id);
    item.setTitle(title);
}

private void setOptionIcon(int id, int iconRes)
{
    MenuItem item = menu.findItem(id);
    item.setIcon(iconRes);
}

Solution 2 - Java

menu.xml

  <item 
    android:id="@+id/item1"
	android:title="your Item">
  </item>

put in your java file

  public void onPrepareOptionsMenu(Menu menu) {
	
	menu.removeItem(R.id.item1);
}

Solution 3 - Java

Like Nikolay said do that in onPrepareOptionsMenu().

For menu items in the action bar you have to invalidate the menu with activity.invalidateOptionsMenu();

This is descriped in more detail here https://stackoverflow.com/questions/7765184

Solution 4 - Java

If I have to change the contents of my options menu I perform it during the onMenuOpened(). This allows me to check the running state at the very moment that the user is accessing the menu.

public boolean onMenuOpened(int featureid, Menu menu)
	{
		menu.clear();
		if (!editable)
		{
			MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
			MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
			MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
			itemAdd.setShortcut('0', 'a');
			itemMod.setShortcut('1', 'm');
			itemDel.setShortcut('2', 'd');
		}
		else
		{
			MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
			itemSave.setShortcut('0', 'S');
		}


		return true;
	}

Solution 5 - Java

To disable certain items:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);

Solution 6 - Java

using the following lines i have done to add the values in menu

getActivity().invalidateOptionsMenu();

try this work like a charm to me.

Solution 7 - Java

Try this code:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
	this.menu=menu;
	updateMenuItems(menu);
	return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	MenuInflater inflater = getMenuInflater();
	inflater.inflate(R.menu.document_list_activity_actions, menu);
	return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
	// Handle presses on the action bar items
	if (item.getItemId() == android.R.id.home) {
		onHomeButtonPresssed();
	}else if (item.getItemId() == R.id.action_delete) {
		useCheckBoxAdapter=false;
		deleteDocuments();
	} else if (item.getItemId() == R.id.share) {
		useCheckBoxAdapter=false;
		shareDocuments();
	} else if (item.getItemId() == R.id.action_tick) {
		useCheckBoxAdapter=true;
		onShowCheckboxes();
	}
	updateMenuItems(menu);
	return true;
}

private void updateMenuItems(Menu menu){
	if (useCheckBoxAdapter && menu != null) {
		menu.findItem(R.id.action_delete).setVisible(true);
		menu.findItem(R.id.share).setVisible(true);
		menu.findItem(R.id.action_tick).setVisible(false);
	} else {
		menu.findItem(R.id.action_delete).setVisible(false);
		menu.findItem(R.id.share).setVisible(false);
		menu.findItem(R.id.action_tick).setVisible(true);
	}
	invalidateOptionsMenu();
}

Solution 8 - Java

You can do something simple like I did. Just change the text to what is needed when the menu item is touched. I needed to turn the sound off and on, plus the ability to perform an action by touching it. Here is my code:

	@Override
public boolean onOptionsItemSelected(MenuItem item) {

	switch (item.getItemId()) {
	case R.id.audioOn:
		audioOn = !audioOn;
		if (audioOn)
			item.setTitle("Audio Off");
		else
			item.setTitle("Audio On");
		return true;

	case R.id.touchOn:
		touchOn = !touchOn;
		if (touchOn)
			item.setTitle("Touch Off");
		else
			item.setTitle("Touch On");
		return true;
	default:
		return super.onOptionsItemSelected(item);
	}
}

audioOn and touchOn are booleans checked in other parts of the code. Hope this helps.

Solution 9 - Java

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calendar, menu);
        if(show_list == true) {         
        
        if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);
         
        return true;
    }
   

Solution 10 - Java

you can accomplish your task simply by implementing as below:

private Menu menu;

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

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    this.menu = menu;
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_toggle_grid) {
        handleMenuOption(id);
        return true;

    } else if(id == R.id.action_toggle_list){
        handleMenuOption(id);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

private void handleMenuOption(int id) {
    MenuItem item = menu.findItem(id);
    if (id == R.id.action_toggle_grid){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_list).setVisible(true);
    }else if (id == R.id.action_toggle_list){
        item.setVisible(false);
        menu.findItem(R.id.action_toggle_grid).setVisible(true);
    }
}

Solution 11 - Java

In case you have a BottomBar:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) {
        getMenuInflater().inflate(R.menu.more_menu, menu);
    }

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.preferences:
            startActivity(new Intent(this, PreferenceActivity.class));
            break;
    }

    return super.onOptionsItemSelected(item);
}

Then you just need to call:

@Override
public void onBottomBarClick(int tabId) {
    supportInvalidateOptionsMenu();
}

Solution 12 - Java

Kotlin Code for accessing toolbar OptionsMenu items programmatically & change the text/icon ,..:

1-We have our menu item in menu items file like: menu.xml, sample code for this:

 <?xml version="1.0" encoding="utf-8"?> 
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/balance"
      android:title="0"
      android:orderInCategory="100"
      app:showAsAction="always" />
 </menu>

2- Define a variable for accessing menu object in class :

var menu: Menu? = null

3- initial it in onCreateOptionsMenu :

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.main, menu)
    this.menu = menu
    return true
}

4- Access the menu items inside your code or fun :

private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
    menuItemBalance?.title = Balance?.toString() ?: 0.toString()
    // for change icon : menuWalletBalance?.icon
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFarhan View Question on Stackoverflow
Solution 1 - JavaEng.FouadView Answer on Stackoverflow
Solution 2 - JavaImdad SarkarView Answer on Stackoverflow
Solution 3 - JavacorbanView Answer on Stackoverflow
Solution 4 - JavaAshterothiView Answer on Stackoverflow
Solution 5 - JavaMarcin S.View Answer on Stackoverflow
Solution 6 - JavaS HemaNandhiniView Answer on Stackoverflow
Solution 7 - JavaSkywalkerView Answer on Stackoverflow
Solution 8 - JavabobView Answer on Stackoverflow
Solution 9 - JavaStefan CizmarView Answer on Stackoverflow
Solution 10 - JavaChiranjhivi GhimireView Answer on Stackoverflow
Solution 11 - JavaLucas MontanoView Answer on Stackoverflow
Solution 12 - JavaHamed JalilianiView Answer on Stackoverflow