La función openOptionsMenu no funciona en ICS?

Im usando la barra de acción compability biblioteca. Estoy tratando de abrir el menú de opciones de un botón con openOptionsMenu () función, pero no hace nada.

El menú muestra como de costumbre al presionar la tecla de menú en mi teléfono. ¿Qué está mal aquí?

public class ReadActivity extends ActionBarActivity { ... @Override public boolean onCreateOptionsMenu(Menu menu) { boolean value; MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.read, menu); value = super.onCreateOptionsMenu(menu); if (Helper.SupportsNewApi()) { getActionBar().hide(); } else { ((View) ((LinearLayout) findViewById(R.id.actionbar_compat)) .getParent()).setVisibility(View.GONE); } return value; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); break; case R.id.menu_search: // Toast.makeText(this, "Tapped search", Toast.LENGTH_SHORT).show(); break; case R.id.menu_bookmark: // selectText(); // setFullScreen(false); break; case R.id.menu_day_night_mode: break; case R.id.menu_settings: break; case R.id.menu_zoom_in: showOverlay(false); break; case R.id.menu_zoom_out: showOverlay(false); break; case R.id.menu_table_of_contents: Intent tocIntent = new Intent(this, TocActivity.class); int GET_SECTION_REFERENCE = 1; startActivityForResult(tocIntent, GET_SECTION_REFERENCE); break; case R.id.menu_overflow: Toast.makeText(this, "Tapped overflow", Toast.LENGTH_SHORT).show(); //closeOptionsMenu(); openOptionsMenu(); //tried the below aswell, no results //getWindow().openPanel(Window.FEATURE_OPTIONS_PANEL, null); break; } return super.onOptionsItemSelected(item); } @Override //disable volume buttons public boolean onKeyDown(int keyCode, KeyEvent event) { if (!menuShown && (keyCode == 25 || keyCode == 24)) { return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Log.d(tag, "Keycode is = "+keyCode); if (keyCode == 82) { if (!menuShown) { //openOptionsMenu(); showOverlay(true); } else { showOverlay(false); } //don't want it to open when pressing menu return true; } else if (keyCode == 4 && menuShown) { showOverlay(false); return true; } else if (keyCode == 25 && !menuShown) { prevPage(); return true; } else if (keyCode == 24 && !menuShown) { nextPage(); return true; } return super.onKeyUp(keyCode, event); } } 

No estoy seguro de cuán relevante es esto, pero este mensaje en el foro que encontré parece responder a la misma pregunta que usted tiene.

Espero que este post sea suficientemente relevante para resolver su problema.

¡Buena suerte!

Yo estaba teniendo el mismo problema tratando de dar la vuelta a esta cosa openOptionsMenu en una aplicación que estaba haciendo que debería ejecutarse en Android 1.6 y subir. Tras la respuesta de Werner Van Belle llegué a la conclusión de que podríamos lograr una solución para resolver el problema. Así que surgió con el siguiente código, siempre es hermoso cuando la gente no marca un método como final, por lo que siempre puede anularlo. Es perfecto si no quieres renunciar a orientar tu aplicación a la última api (android: targetSdkVersion = "17"). Espero que les guste. 🙂

 @Override public void openOptionsMenu() { Configuration config = getResources().getConfiguration(); if((config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) > Configuration.SCREENLAYOUT_SIZE_LARGE) { int originalScreenLayout = config.screenLayout; config.screenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE; super.openOptionsMenu(); config.screenLayout = originalScreenLayout; } else { super.openOptionsMenu(); } } 

Para arrojar algo de luz sobre este triste desarrollo por google. Obviamente, Google desea a todos que abracen la nueva ActionBar. Podrían haber logrado eso haciendo que el ActionBar sea ​​más fácil de usar que el antiguo sistema de menús. Sin embargo, no es así como planificaron la transición. No, pensaron que tendría sentido para los programadores harras por hacer los viejos menús imposibles de usar, pero sin proporcionar compatibilidad hacia atrás adecuada.

A continuación se muestra el código tomado de com.android.internal.policy.impl, que se supone que debe crear el panel optionsMenu. Como puede ver, el código simplemente se niega a crear un panel de opciones. Allthough, la capacidad es obviamente allí. Por lo tanto, para responder a su pregunta: olvídalo, Google no quiere que utilice ese optionsPanel más.

  // 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; } } 

No puedo entender el bloqueo forzado del uso del botón Menú también. Sin embargo, el siguiente truco me ayudó a mostrar un menú sobre "restringido" tipos de dispositivos.

En primer lugar tenemos que definir, si necesitamos el siguiente hack o no.

 boolean requireDirtyMenuButtonHack = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && (activity.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_XLARGE) > 0; 

Entonces:

 protected final OnClickListener mMenuButtonClickListener = new OnClickListener() { @Override public void onClick(View v) { if (requireDirtyMenuButtonHack) { Configuration config = getContext().getResources().getConfiguration(); config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_XLARGE; config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_LARGE; } getActivity().openOptionsMenu(); } }; 

No se olvide de la limpieza! (No sé si es necesario, pero mejor para jugar tipo)

 public void onPrepareOptionsMenu(Menu menu) { if (requireDirtyMenuButtonHack) { Configuration config = getContext().getResources().getConfiguration(); config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_LARGE; config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_XLARGE; } //do the preparing... } 

Android: targetSdkVersion = "10" en el manifiesto me ayudó. OpenOptionsMenu () funciona como se esperaba ahora en ICS +. Además, aparece el botón de menú "desbordamiento" en la parte inferior de la pantalla (en el panel de botones del dispositivo).

Ps: Yo uso NoTitleBar tema (NoActionBar para sdk 11 y superior) + ViewPagerIndicator por Jake Wharton.

Esto funcionó para mí, mi código es bastante similar a la suya, y lo que quiero hacer es de un botón en la barra de acción, abra el menú de desbordamiento :

 public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_home_about: dialog = new Dialog(this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.customdialog); dialog.show(); break; default: case R.id.menu_home_refresh: updateLists(true); break; case R.id.menu_home_menu: new Handler().postDelayed(new Runnable() { public void run() { openOptionsMenu(); } }, 0); return true; } return false; } 

¿Quieres decir que quieres mostrar un botón en el lado derecho de la barra de acción?

Aquí es cómo hice el mío:

Res / menu / main.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_share" android:title="Logout" android:icon="@android:drawable/ic_lock_power_off" android:orderInCategory="1" android:showAsAction="always" /> </menu> 

Actividad
1) tomar nota de la ActionBarActivity; 2) MenuInflater en onCreateOptionsMenu 3) onOptionsItemsSelected (creo que necesitas devolver super.onOptionsItemSelected (item))

 public class BaseActivity extends ActionBarActivity { .... @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } .... @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_share: //Do something break; } return super.onOptionsItemSelected(item); } 

Si está utilizando su barra de herramientas personalizada, puede probar:

 toolBar.showOverflowMenu(); 
  • Error: no se encontró identificador de recurso para el atributo "showAsAction" en el paquete android
  • ¿Cuándo ocurre onCreateOptionsMenu en una actividad activada con ActionBar?
  • Menú de navegación lateral de Android: cómo incluir la barra de acción en la vista deslizante?
  • Estilo de elemento de menú Arc como en la aplicación tumblr para Android
  • Menú personalizado de PopUp
  • Compatibilidad con Android ActionBar: MenuItem.setActionView (Ver)
  • Android - Uso correcto de invalidateOptionsMenu ()
  • Cómo hacer que el menú de opciones aparezca en la parte inferior de la pantalla de Android
  • Opciones de Skin Menu Android
  • Activar / Desactivar el elemento del menú ActionBar
  • Android alinea los elementos del menú a la izquierda en la barra de acción
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.