I have set the action bar button using xml, but I want to set the icon using java code because I want the icon to be changeable.
I want to set the icon in onCreateOptionsMenu().
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mymenu, menu);
return true;
}
you first get the item using Menu.findItem(), then call MenuItem.setIcon() to set the icon
code:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mymenu, menu);
menu.findItem(R.id.messages).setIcon(R.drawable.ic_action_email);
return true;
}
Get your menu item by index and set icon:
menu.getItem(index).setIcon(R.drawable.icon);
for ex:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mymenu, menu);
menu.getItem(index).setIcon(R.drawable.icon);
return true;
}
Related
I have been stuck trying to simply change the transparency of this MenuItem icon for hours... I'm not sure what else to do. I am able to successfully call setEnable() on the icon, which means the problem is not accessing it. It must have something to do with the icon itself. I am using the standard Material theme that comes with the "Basic Activity Template", would a style or theme even prevent me from programmatically changing it? I am calling onPrepareOptionsMenu from a fragment, could that be the issue? Here is my code:
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
// top menu (action bar)
inflater.inflate(R.menu.menu_searches, menu);
// bottom menu (the one I am having an issue with)
Menu bottomMenu = toolbarBottom.getMenu();
// the MenuItem I am trying to call "setAlpha()" on
deleteMenuItem = bottomMenu.findItem(R.id.action_delete);
for (int itemIndex = 0; itemIndex < bottomMenu.size(); itemIndex++) {
bottomMenu.getItem(itemIndex).setOnMenuItemClickListener(new
MenuItem.OnMenuItemClickListener() {
#Override
public boolean onMenuItemClick(MenuItem item) {
return onOptionsItemSelected(item);
}
});
}
}
#Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (itemsChecked > 0) {
deleteMenuItem.setEnabled(true);
/* I have also tried "delete.getIcon().mutate().setAlpha(255);" -
- but I do not have another instance of the icon so I don't think I need to -
- call "mutate()". It didn't work anyways */
deleteMenuItem.getIcon().setAlpha(255);
} else {
deleteMenuItem.setEnabled(false);
deleteMenuItem.getIcon().setAlpha(5);
}
}
menu.findItem() is laggy and calling it within onPrepareOptionsMenu(Menu menu) produces bad user experience. It's better to get MenuItem object once while creating menu, and then just call setAlpha each time menu occures on screen. You can try
MenuItem mDynamicMenuItem;
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
// Get dynamic menu item
mDynamicMenuItem = menu.findItem(R.id.menu_item);
return true;
}
#Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
// Here is just a good place to update item
MenuItem delete = mDynamicMenuItem.findItem(R.id.action_delete);
if (itemsChecked > 0) {
delete.setEnabled(true);
delete.getIcon().setAlpha(255);
} else {
delete.setEnabled(false);
delete.getIcon().mutate().setAlpha(5);
delete.getIcon().setAlpha(5);
}
return true;
}
I want to enable/disable option menu item on action bar based on server response in Android. I can disable the options menu using this code
#Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (isFinalized) {
menu.getItem(1).setEnabled(false);
}
return true;
}
But my need is, I want to disable the menu item with server response key
Thanks in advance
You need to store Menu object in your Activity or Fragment whichever you use.
private Menu mMenu;
and
#Override
public boolean onCreateOptionsMenu(Menu menu) {
mMenu = menu;
}
in your server response class (e.g. AsyncTask or Volley etc..), after the response access that mMenu object and update it.
menu.getItem(id).setVisible(false); // do whatever operation you want
invalidateOptionsMenu();
Try this:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
mMenu = menu;
getMenuInflater().inflate(R.menu.menu_invitation_detail, menu);
if (isFinalized) {
menu.getItem(0).setVisible(false);
} else {
menu.getItem(0).setVisible(true);
}
return super.onCreateOptionsMenu(menu);
}
PRINT SCREEN
I'm willing to block to the user the possibility to open the menu using menu key.
The menu must be opened only from the menu button in my application.
So I deleted this part of code:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Now if I press the key button it happens nothing and that's what I wanted.
The problem is that if I press my menu button in app, the menu doesn't show up anymore...
So what do?
I thought to add the
getMenuInflater().inflate(R.menu.main, menu);
in my listener on the menu button but here is the error and I don't understand what to do... any advice?
Thank you!
Do it with Style templates. If SDK < Jelly Bean use style with ActionBar.
You have to add the onCreateOptionsMenu part. But override the onKeyDown event to disable the menu key. Like this:
#Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
return keyCode == KeyEvent.KEYCODE_MENU || super.onKeyDown(keyCode, event);
}
I am not sure but this should work
Define this variable in your main class (outside all subclasses) -
public class ... extends ... {
boolean menu = false;
...
}
And then whenever you click on menu button on your print screen, do the following -
#Override
public void onClick(View v){
menu = true;
openOptionMenu();
}
And in your onCreateOptionMenu, do this -
#Override
public boolean onCreateOptionsMenu(Menu menu) {
if(menu){
getMenuInflater().inflate(R.menu.main, menu);
}
menu = false;
return true;
}
I am running the demo from https://github.com/googlecast/CastVideos-android .
It is dependent the library located here https://github.com/googlecast/CastCompanionLibrary-android
The project is set up with all the necessary libraries and required jar.
The project compiles and runs no problem except that the chromecast button does not show up in the actionBar.
The button shows up if I modify onCreate with the following :
mSelector = new MediaRouteSelector.Builder()
.addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
.addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)
.addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
.addControlCategory(CastMediaControlIntent.categoryForCast(getResources().getString(R.string.app_id))).build();
and modify onCreateOptionsMenu with the following :
#Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.main, menu);
//mediaRouteMenuItem = mCastManager.addMediaRouterButton(menu, R.id.media_route_menu_item);
//Attach the MediaRouteSelector to the menu item
//MenuItem
mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
MediaRouteActionProvider mediaRouteActionProvider = (MediaRouteActionProvider)MenuItemCompat.getActionProvider(mediaRouteMenuItem);
mediaRouteActionProvider.setRouteSelector(mSelector);
return true;
}
If I simply leave onCreateOptionsMenu as it was out of the box, then it does not work.
#Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.main, menu);
mediaRouteMenuItem = mCastManager.addMediaRouterButton(menu, R.id.media_route_menu_item);
return true;
}
Any ideas as to why this is?
Your device is probably not whitelisted for your app. You might want to look at the instructions here.
When I touch this "Edit" button I want it to change to "Done". Is there a way to do this?
I tried this but it only works when opening the menu on the right side:
#Override
public boolean onPrepareOptionsMenu(Menu menu) {
// change the text here.
return super.onPrepareOptionsMenu(menu);
}
I assume that, at some point, you inflate the menu, yes?
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.some_menu_layout, menu);
return true;
}
So you can go into your menu (in this case, res/menu/some_menu_layout.xml), and find the android:id of the menu item you want to find. You should then be able to use menu.findItem(theId).setTitle("Done");. (You may have to save your Menu variable as a local member to do this.)