I am using Sherlock actionbar to prevent compatibility issue of action bar but my prolem is does not worked well with android 3.0 or later here is my screen snap..
in android 2.2
now this is fine and i love it..but when i run it on AVD 4.0 it look like this
the pop-up list shown is displayed when i press menu button.
so how to do the same behavior on higher version also?
Here is my oncreateOptionmenu method..(from which menu inflated)
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
}
I think the problem is the configuration of your Emulator. An Emulator with Android 4.0 should not have a Hardware Back Button instead it should have three software buttons (back, home, used apps)on the screen, my guess is that if a device features a menu button the action bar will get rid of the overflow icon and show the overflow menu if the hardware button is pressed.
Try to configure an Emulator without hardware buttons. For that create a new Emulator and click new in the hardware field. Now choose Hardware Back/Home keys and select no as value.
If you don't get the correct behaviour on this emulator post screenshots from that emulator to give us a further clue.
Related
I'm targeting Android >=4 and I have an issue with the ActionBar.
I need to dynamically update the action bar and all the code seems to work fine on a Nexus 7 and Nexus 4. The problem I have is with an Xperia S (Android 4.1.2). The Nexus devices update the ActionBar immediately. The Xperia only updates when the hardware menu button is pressed.
I call invalidateOptionsMenu() which in turn successfully calls the onPrepareOptionsMenu(Menu menu) on all devices. The difference is that the Xperia is simply not updating the display. As soon as I click the hardware menu button, up pops the menu items and buttons.
I've read quite a few posts and tried numerous methods - I simply can't get the Xperia to behave properly.
I've messed around with this and the best I can come up with is to recreate the activity which gives and unacceptable user experience.
Everything works fine on devices with soft menu buttons. Until I can come up with something better I've decided to force all menu items on to the action bar drop down menu for devices with a hardware menu button.
I detect the hardware menu button in the onCreate of the Activity;
this.hardwareMenuButton = ViewConfiguration.get(getApplicationContext()).hasPermanentMenuKey();
Then I have something like this;
#Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem menuItem = menu.add("Refresh");
if(this.hardwareButton) {
menuItem.setShowAsActionFlags(android.view.MenuItem.SHOW_AS_ACTION_NEVER);
} else {
menuItem.setIcon(R.drawable.ic_action_refresh);
menuItem.setShowAsActionFlags(android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
return super.onPrepareOptionsMenu(menu);
}
From the article "Say Goodbye to the Menu Button "
it seems now the menu button is going to the action bar.
"If you’ve already developed an app to support Android 2.3 and lower,
then you might have noticed that when it runs on a device without a
hardware Menu button (such as a Honeycomb tablet or Galaxy Nexus), the
system adds the action overflow button beside the system navigation. "
But since I do not want the action bar takes the space, and I only need one menu button there, I hope I had a menu button within the navigation bar at the bottom.
How to do that?
[Update] From one aplication's code, it seems if I set the target level is lower, and use the add menu function, the menu button can be put with the navigation bar at the bottom. But anyway, as Samus Arin said, if there is only button for the menu, it doesn't make sense to build a action bar.
You can develop for newer releases, and then detect if there is a menu-button on the device. If there is not, show your own in the UI.
http://developer.android.com/reference/android/view/ViewConfiguration.html#hasPermanentMenuKey()
Ex.
if(ViewConfiguration.hasPermanentMenuKey(context)){ Has menu-button } else { Does not have menu-button, show in UI }
As you said, if you want the overflow-button in the navigation-bar you have to set the target-sdk to 13 or lower.
IMO this option should be given to the developer regardless of targetsdk.
UPDATE: hasPermanentMenuKey() can only be used in SDK>13, so you have to check this manually in your code.
I have an application which runs full-screen and relies on the menu button. What I didn't realise is that devices like the Galaxy Tab use an actionbar which no longer has a menu button. My app currently loads a fragment displaying a settings menu when one touches the menu button:
#Override
public boolean onPrepareOptionsMenu(Menu menu) {
FragmentManager lFM = getSupportFragmentManager();
SettingsDialogFragment lSettingsDialog = new SettingsDialogFragment();
lSettingsDialog.show(lFM, "Settings");
return false;
}
I understand it is possible to add a custom icon to the action bar which when pressed could result in the same behaviour as a menu button. What I am unsure about is how to implement this.
How do I know that a device doesn't have a menu button and I need to add an icon to the action bar? It can't be as easy as checking the SDK version as apparently the actionbar was introduced in honeycomb, but my Galaxy Note runs ice cream sandwich and doesn't have an action bar (it still has a menu button). I don't want to give up any real-estate so adding buttons or menu options to my main layout isn't an option.
I just read on google developer that:
Navigation Bar New for phones in Android 4.0, the navigation bar is
present only on devices that don't have the traditional hardware keys.
It houses the device navigation controls Back, Home, and Recents, and
also displays a menu for apps written for Android 2.3 or earlier.
So I tried setting the target version on my app to 8. Instead of a menu I get a button allowing me to change the screen size of my app - but no menu button.
I have an application which runs full-screen and relies on the menu button.
That has been a bad idea for two years.
What I didn't realise is that devices like the Galaxy Tab use an actionbar which no longer has a menu button.
Such devices have been around for two years.
My app currently loads a fragment displaying a settings menu when one touches the menu button
That was never an appropriate design move. Please allow the MENU button, where it exists, to behave normally, displaying an options menu on Android 1.x/2.x and triggering the action bar overflow on Android 3.0+.
How do I know that a device doesn't have a menu button
http://developer.android.com/reference/android/view/ViewConfiguration.html#hasPermanentMenuKey()
How do you show an options menu on Honeycomb, or an ICS tablet, without an action bar?
After some playing around, it seems there is no way to have an options menu on Honeycomb devices if there is no action bar and targetsdkversion is >=11. Even if your theme is Theme.Holo.NoActionBar. The only way I can see to show an options menu on Honeycomb with targetsdkversion>=11 is with a theme that does have an action bar, and then hiding it in onCreate.
The only way I can see to display the older panel menu on Honeycomb is with targetsdkversion<=10.
In summary, in Honeycomb, there is no way to have an options menu if you don't have an action bar, unless you target below 11. This seems like a bug. In ICS and up you can
have whatever options menus you like, regardless of if you actually have an action bar.
My original goal was to be able to use both the old style panel menu, and new Action Bar menu (in different activities) on Honeycomb and up, while using the panel menu everywhere below Honeycomb.
The reason is there is one activity where it is a requirement to have large menu buttons, however the rest of the app can be perfectly Holo-ed.
To achieve this, I have used Theme.Holo (for api 11+) everywhere except for this one activity where I use Theme.NoTitlebar. I have android:minSdkVersion="5" android:targetSdkVersion="14", so the support menu key doesn't show (and thus doesn't waste screen space on some new HTC phones). I provide my own button to pop up the panel menu if the device doesn't have a hardware menu button (via http://developer.android.com/reference/android/view/ViewConfiguration.html#hasPermanentMenuKey() )
The problem is, this didn't work on a Honeycomb tablet (Galaxy Tab, Honeycomb 3.2). The normal activities with the action bar work fine, but on the special activity nothing happens when I press the menu button (the one I've provided in the UI).
This works fine on at least 2 ICS phones and the emulator (with and without a hardware menu key). Normal action bar menus everywhere except on this one activity, where I get the large panel menu.
So what is the solution? Is this a problem with the Galaxy Tab or with Honeycomb? Is there a different theme I should be using to provide the panel menu?
Edit: I obtained an ICS tablet for more testing, and found the panel menu didn't appear there either. So the exact same app, on the same version of Android, will show a panel menu on a phone and nothing on a tablet. Huh?
Below is an extract from the PhoneWindow system class as for Honeycomb and above Android versions. It is really hardcoded check for Android target version and device screen size. Would you be able to avoid this check - the menu would be displayed normally. But there is no such possibility. That is why it is impossible to show options menu on Honeycomb+ devices with target sdk set to value above 10. It is funny, that in case action bar menu could be displayed, it will be displayed earlier and this code will never be reached. Because of this, the comment above the code looks especially derisively.
// Don't open an options panel for honeycomb apps on xlarge devices.
// (The app should be using an action bar for menu items.)
if (st.featureId == FEATURE_OPTIONS_PANEL) {
Context context = getContext();
Configuration config = context.getResources().getConfiguration();
boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
Configuration.SCREENLAYOUT_SIZE_XLARGE;
boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=
android.os.Build.VERSION_CODES.HONEYCOMB;
if (isXLarge && isHoneycombApp) {
return;
}
}
in my app the android default menu button is not visible? why? Any help?
Refer this:
On Android Honeycomb how do I add option menu to the home bar at the bottom of the screen?
And this:
onCreate Options menu is not showing in android 3.1
You can simple edit target SDK in manifest file to force use SDK of mobile rather than tablet like this:
android:targetSdkVersion="10"
Not only should your apps stop relying on the hardware Menu button, but you should stop thinking about your activities using a “menu button” at all.Your activities should provide buttons for important user actions directly in the action bar (or elsewhere on screen). Those that can’t fit in the action bar end up in the action overflow.
In order to provide the most intuitive and consistent user experience in your apps, you should migrate your designs away from using the Menu button and toward using the action bar.
Ice Cream Sandwich rolls out to more devices, it’s important that you begin to migrate your designs to the action bar in order to promote a consistent Android user experience.See this link
Did you hook up a xml menu file to your activity ?
#Override
public boolean onCreateOptionsMenu(android.view.Menu menu) {
getMenuInflater().inflate(R.menu.xmlfilename, (android.view.Menu) menu);
return true;
}