I am following the tutorial on the developer website to implement an action menu bar, and I cant seem to get the icon to be drawn. http://developer.android.com/training/basics/actionbar/adding-buttons.html
Here is what I have so far...
res/menu/main_activity_actions
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Search, should appear as action button -->
<item android:id="#+id/action_search"
android:icon="#drawable/ic_action_search"
android:title="#string/action_search"
android:showAsAction="ifRoom" />
<!-- Settings, should always be in the overflow -->
<item android:id="#+id/action_settings"
android:title="#string/action_settings"
android:showAsAction="never" />
</menu>
Then I added that menu to the main activity
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
I am pretty sure the icon can be found because I added it in all res/drawable-* folders
Then when I run the virtual device this is what I get
As you can see, the 2 menu items are there, but search has no icon like it does in the tutorial. Heres what it's supposedly supposed to look like
I have been going through the tutorials as well, and ran into the same difficulty. Here is what I found.
I spent a few hours trying the various technical solutions given for the problem. None of them made sense given my context. I tried a few things that seemed to suggest themselves to no avail. Then I found another possible solution, and although quite a bit simpler, perhaps harder to debug.
Make sure that the icons you provide are from the action bar icons in the path: holo_dark -> 01_core_search.
The holo_light icons were the same color as the background of my device and so appeared as if not present. Press on the screen in that area, and the icon does appear because the background color changes with selection of the menu item.
Hope this helps.
Related
I know it has been asked several times before. But I guess I have to ask the question myself because none of the existing ones fits my problem:
I am developing for Kitkat(4.4) and try to use a action bar with the theme: holo.light.darkActionBar.
I created some xml files with the items in menu and linked it in the java class to the activity:
menu/main:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
<item android:id="#+id/action_filter"
android:title="#string/action_filter"
android:orderInCategory="100"
android:icon="#drawable/ic_action_filter"
app:showAsAction="ifRoom" />
MainActivity:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
menu.clear();
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
The Problem is the following:
When I click on the menu/main.xml I can see that a item is added to the actionbar. But it never appears in the activity_main.xml.
I searched for many hours and considered the following:
-set minSDK to 19
-i know that some time it does not show up because the device has a menu button. But I use a icon and say it should be displayed. Therefore it should show up. And I also use a Nexus Emulation which has not menu button.
-I use Android studio and inserted the activities with the assistentce of android studio.
-The mainActivity extends FragmentActivity(because I chose to have a google maps activity)
-I tried other themes but then the actionbar disappears totally(oc did not use .noActionBar!)
-I set a style for the actionbar and there I specify a red color. This color is propagated to the activity but not the items.
my imports are:
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.Menu;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
How it should look:
How it looks rightnow:
I really really hope some of you can help me, it drives me nuts.
I think, your code to inflate the menu should look like this :
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
And remove menu.clear() line.
try to use a action bar with the theme: holo.light.darkActionBar
That means that you are trying to use the native action bar.
I created some xml files with the items in menu and linked it in the java class to the activity
Get rid of the app namespace, and rename app:showAsAction to be android:showAsAction. The app convention is used for the appcompat-v7 action bar backport, which you are not using.
MainActivity:
Get rid of menu.clear().
But it never appears in the activity_main.xml.
It is not supposed to. It should show up when you run the app, not necessarily in editors for other resources.
And I also use a Nexus Emulation which has not menu button
There certainly were Nexus devices with MENU buttons. Try pressing PgUp; if you get the overflow menu rising from the bottom of the screen, your emulator has a MENU button.
Here's what I have in my code:
#Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
if (MainActivity.fifty){
menu.findItem(R.drawable.fifty).setIcon(R.drawable.fiftyf);
}
return super.onCreateOptionsMenu(menu);
}
Now the thing is that when I delete if statement, then it works fine, but icon is not getting changed on the next activity.
Here's my xml file for menu:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="#+id/aud"
android:icon="#drawable/aud"
android:orderInCategory="1"
android:showAsAction="always"
android:title="Audience's Help"/>
<item
android:id="#+id/fifty"
android:icon="#drawable/fifty"
android:orderInCategory="2"
android:showAsAction="always"
android:title="50:50"/>
<item
android:id="#+id/friend"
android:icon="#drawable/friendhelp"
android:orderInCategory="2"
android:showAsAction="always"
android:title="Friend's Help"/>
As you can see, I just started to create icon changes. The idea is that the button is 50:50 for the game called "Who wants to be a millionaire". Now in the next activity, I am trying to set R.drawable.fiftyf, which is a disabled 50:50 icon, because when user uses it, it should not be available anymore.
When I tried to add it in menu.xml, then new icon was just added, which I don't need. Please also note, that icon gets changed according to my method, but app crashes when it goes to next activity.
Thanks all.
Please let me know if additional info required.
This is wrong:
menu.findItem(R.drawable.fifty).setIcon(R.drawable.fiftyf);
Should be something like this:
menu.findItem(R.id.fifty).setIcon(R.drawable.fiftyf);
I've been trying to follow the official Android development tutorial for a couple of days but I've noticed there's a few discrepancies between the two available IDEs, Eclipse with the ADT plugin and Android Studio. I heard nice things about the latter so that's the one I'm using, but there seems to be differences in the way the files are laid out when you first create a new project. I've mostly been able to solve stuff here and there so it works just like on Eclipse (the IDE used on the tutorial) but I can't figure out why my Action Buttons aren't showing up in the ActionBar. Here's the tutorial for reference.
So, this is what my res/menu/main.xml file looks like:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.myapplicationn.app.MainActivity" >
<item android:id="#+id/action_search"
android:icon="#drawable/ic_action_search"
android:title="#string/action_search"
app:showAsAction="ifRoom" />
<item android:id="#+id/action_settings"
android:title="#string/action_settings"
android:orderInCategory="100"
app:showAsAction="never" />
</menu>
All I did was replace action_settings and copy action_search directly from the tutorial's sample code. There's a subtle (maybe not that subtle) difference here between AS and the tutorial: the tutorial's file is supposed to be res/menu/main_activity_actions.xml but its AS equivalent seems to be the default file res/menu/main.xml, so I went with that. Also, the tutorial sample only has the first attribute (xmlns:android="http://schemas.android.com/apk/res/android"), but the file created by AS had those additional ones so I left them untouched. Then, I modified the onCreateOptionsMenu method with this:
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
Once again, the original code used R.menu.main_activity_actions, so I changed it to R.menu.main. The project compiles nicely and MainActivity shows up in my phone after a few seconds, but action_search is still hidden under the action overflow (isn't that what it's called?) button. Am I doing something wrong? Any help is appreciated. English isn't my first language and my writing style is kind of lousy, so sorry for that.
I had the same issue recently.
The showAsAction property is in the app namespace. It is explained in the tutorial that it is used when using the compatibility library. But if you are targeting an API level high enough that shouldn't be needed.
I was able to use the android namespace and it works fine for me. So change app:showAsAction to android: showAsAction and it will show up where you want it.
try this menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="#+id/action_search"
android:icon="#drawable/ic_action_search"
android:showAsAction="ifRoom"
android:title="#string/action_search"/>
<item
android:id="#+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="#string/action_settings"/>
Make sure the activity which is creating the menu inherits from ActionBarActivity, which is the base activity class when using the support library.
Otherwise, whatever you set in app:showAsAction will not work.
I've scratched my head wondering why this didn't work for me in the past, dunno why they don't mention that in that tutorial you linked.
Hopefully this is your issue.
Bit late to the party. For those who still are having problem with this,
Try Removing this line
xmlns:app="http://schemas.android.com/apk/res-auto"
and change
app:showAsAction="always"
to
android:showAsAction="always"
IMPORTANT:
Make sure that you PNG Image is not larger than 27x27
I had the exact same problem while using Android Studio and following the official tutorial. Here is what worked for me, no idea why though.
1) I used the ic_launcher instead of the ic_action_search just to check if the search icon file itself had some issues.
<item android:id="#+id/action_search"
android:icon="#drawable/ic_launcher"
android:title="#string/action_search"
app:showAsAction="ifRoom" />
Now I could see that the launcher icon was visible.
2) Then I downloaded again the icons from the "Action Bar Icon pack" and changed the android:icon back to ic_action_search.
And now the search button is visible.
Like I said not sure why this worked.
Me too, have been following the tutorials, the link you have poosted. Same thing, the buttons just not show in the ToolBar, tried different solutions. Finally, one from Udacity is working.
Solution:
on your MainActivity, add the follwing code:
#Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.your_menu,menu);
return true;
}
The rest is the same as the code in the official link, here, https://developer.android.com/training/appbar/actions.html#add-actions
I tried to create a menu with search and refresh button, but since refresh button will only be available at several activities, I want to set the visibility to false, and then add this:
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mainmenu, menu);
MenuItem item = menu.findItem(R.id.action_refresh);
item.setVisible(true);
return true;
}
to the activity java
Using the below code, the menu is displayed properly, with refresh on the left and search on the right
<item
android:id="#+id/action_search"
android:title="Search"
android:menuCategory="system"
android:orderInCategory="2"
android:showAsAction="always"
android:icon="#drawable/ic_action_search"/>
<item
android:id="#+id/action_refresh"
android:title="Refresh"
android:menuCategory="system"
android:orderInCategory="1"
android:showAsAction="always"
android:icon="#drawable/ic_action_refresh"
android:visible="false"/>
But by reversing the item order,
<item
android:id="#+id/action_refresh"
android:title="Refresh"
android:menuCategory="system"
android:orderInCategory="1"
android:showAsAction="always"
android:icon="#drawable/ic_action_refresh"
android:visible="false"/>
<item
android:id="#+id/action_search"
android:title="Search"
android:menuCategory="system"
android:orderInCategory="2"
android:showAsAction="always"
android:icon="#drawable/ic_action_search"/>
the refresh button/item will not appear.
While I have found the workaround and could proceed, this still puzzles me very much, and I haven't got any good explanation.
Why would that happen?
Are you using Eclipse?
I have seen a bug in Eclipse where simply changing the order of elements in an XML resource file would not recompile the file causing all kinds of weird things to happen.
I suggest you do a "Project > Clean" to make sure the resource identifiers get recreated from scratch.
I've got an app that I've written targeting Android 2.1 which makes use of the menu button to expose some options. I'd like to have this menu available through the action bar overflow button in ICS, but I'm having trouble with getting it to show up.
If I change my target API to 15, the legacy menu button in the bottom bar disappears in ICS, but the icon in the top right of the action bar doesn't replace it, so there is no way to access the menu. I've tried adding the showAsAction attribute to the menu items, which did nothing. I'm definitely targeting 4.0.3 in my Eclipse build options.
All I want is for that menu to be accessible somewhere whilst using the ICS Holo theme, but still backwards compatible to older devices. How do I go about that?
Usually you add those Action Items simply by implementing the onCreateOptionsMenu(Menu menu) and adding the android:showAsAction="ifRoom" for the desired items in the menu's XML file.
e.g.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="#+id/menu_save"
android:icon="#drawable/ic_menu_save"
android:title="#string/menu_save"
android:showAsAction="ifRoom|withText" />
</menu>
Did you consider this fact?
Edit:
Here is a simple implemantation which worked for me a while ago:
#Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
createMenu(menu);
return true;
}
private void createMenu(Menu menu){
MenuItem mnu1 = menu.add(0, 0, 0, "Logout");
{
mnu1.setAlphabeticShortcut('a');
mnu1.setIcon(R.drawable.icon);
mnu1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
}
I was having this issue 5 minutes ago. Dont know if this can be still helpful, but this is how I got it solved:
Add super.setBooleanProperty("showTitle", true); to your onCreate method
#Override
public void onCreate(Bundle savedInstanceState) {
super.setBooleanProperty("showTitle", true);
super.onCreate(savedInstanceState);
//more code...
This will force the action bar to show and the menu button replacement will be there.
I am targeting android 4 in eclipse. Older devices show the bar as title only and of course are listening to default menu button action.