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;
}
}
Related
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'm currently android application. In this application, I've added following line to hide topbar of android.
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
In this case, when users want to enter setting of my apps in phone, they can press "menu" button of Android phone. But for Samsung Galaxy tab2 7.0, there is no menu button in it. That's why I want to know how can I detect current access device is tablet or not in my apps. If tablet, I want to display toolbar of Android in my apps.
Your Galaxy Tab is running Honeycomb or higher, which means that the old Options Menu has been deprecated in favor of Action Bar. That having been said, there's still a menu icon in the title bar (a square with a slash through it in Honeycomb and three square dots in Jelly Bean). If your user clicks that, they get your standard options menu (without menu item icons, however).
The alternative is to run ActionBar Sherlock to give your apps action bars, regardless of OS version.
If you insist on doing your own branching based on OS version, try this:
int sdk = android.os.Build.VERSION.SDK_INT;
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB)
{
// Gingerbread and earlier
}
else
{
// Honeycomb and later
}
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()
My app has an extended menu and has been working on all legit devices from Android 2.1 up thru 4.1. For R11+, to save screen space, I do not display the Action Bar on "normal" screens, but do on "large" and "xlarge". With the Action Bar present, the menu icon is on the Action Bar in the upper right corner; on normal-size screens, without hardkeys, it is at the lower right in the bar with the Home and Back buttons. This is functioning as expected on the latest phones and tablets.
Now I've had two customers with some sort of direct-from-China-on-eBay 7" tablet running Android 4.0.4 who are not seeing either the Action Bar or the menu icon in the Home/Back bar. I see two malfunctions here: first, that it must be reporting its screen as "normal" since it's using the "NoActionBar" theme; and secondly that it's not then showing the menu icon in the bottom bar. The users state that this device has access to Google Play, so I assume it's an approved device.
Has anyone run into anything like this? The only solution I can see -- since I don't want to activate the Action Bar on everyone's smartphone -- is to add a settings option to display the Action Bar. Any other ideas?
I'm On Honeycomb (3.1) and my first problem is that I don't know what is the name of the bar at the bottom of the OS (appears in every application). I've seen some apps add options to this bottom bar (it has by default the back button the home button and the show active programs button, besides the watch, battery indicator and signal connection strength). When a certain program uses options it sometimes adds them to this bottom bar (it is usually seen as a grid-like icon next to the show active programs buttons, which you can click and a menu pops up.
I've described it as best as I can, but My question is simple: how can I create a menu like this on in my app?
Thanks for any help!
EDIT:
Ok, I've just read it's a compatibility feature. And it's not supposed to be there in an Android App.
I feel stupid...
I'm On Honeycomb (3.1) and my first problem is that I don't know what is the name of the bar at the bottom of the OS (appears in every application).
That is the "system bar".
I've seen some apps add options to this bottom bar
This happens automatically for applications that set up an options menu using onCreateOptionsMenu(). However, once the application switches to the Honeycomb look-and-feel (e.g., via android:targetSdkVersion="11"), the options menu moves to the action bar.
how can I create a menu like this on in my app?
Long-term, you do not want to do this, because it means that you will not have the action bar and will not look like you belong on Honeycomb, Ice Cream Sandwich, etc.
Short-term, simply do not have android:targetSdkVersion="11", and implement an options menu as normal.