(Obsoleto) Fragmento onOptionsItemSelected no se llama

EDIT: esta pregunta fue para la barra de acción sherlock en desuso. Se debe usar la biblioteca de soporte de Android ahora

He agregado una opción del menú de la barra de acciones llamada compartir para mi fragment que aparece pero el evento de selección no está siendo capturado

Lo estoy agregando así

 @Override public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) { MenuItem item = menu.add(0, 7,0, R.string.share); item.setIcon(R.drawable.social_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } 

Tratando de capturarlo tanto en el fragment como en la fragment activity como

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 7: Intent share = new Intent(Intent.ACTION_SEND); share.setType("text/plain"); share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!"); startActivity(Intent.createChooser(share, "Share Text")); return true; default: return super.onOptionsItemSelected(item); } } 

y he setHasOptionsMenu(true); en el onCreate() .

Los mismos problemas me sucedieron a mí:

Los eventos onMenuItemSelected no se llamaron en Fragment

Google buscado no puede encontrar una solución, y agregar el método MenuItemSelected en FragmentActivity no lo resuelve.

Finalmente resuélvelo siguiendo la referencia a http://developer.android.com/guide/topics/ui/actionbar.html

Nota: Si agregó el elemento de menú de un fragmento, a través de la callback onCreateOptionsMenu de la clase Fragment, el sistema llama al método respectivo onOptionsItemSelected () para ese fragmento cuando el usuario selecciona uno de los elementos del fragmento. Sin embargo, la actividad tiene la posibilidad de manejar el evento primero, por lo que el sistema llama aOptionsItemSelected () en la actividad antes de llamar a la misma callback para el fragmento.

Lo que significa que solo si no tiene ese controlador de elementos de menú en onOptionsItemSelected () en la actividad, se llamará onOptionsItemSelected () en el fragmento.

Código de la siguiente manera —– Eliminar el controlador de R.action.add en FragmentActivity):

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: popBackStack(); return true; case R.id.action_search: searchAction(); return true; case R.id.action_logout: userLogout(); return true; //case R.id.action_add: //return true; default: return super.onOptionsItemSelected(item); } } 

Y el controlador para R.action.add en Fragment se ve así:

 @Override public boolean onOptionsItemSelected(MenuItem item) { Log.d("onOptionsItemSelected","yes"); switch (item.getItemId()) { case R.id.action_add: add(); return true; default: return super.onOptionsItemSelected(item); } } 

Finalmente, recuerda agregar

  setHasOptionsMenu(true); 

en tu método onCreate en Fragment

Tuve el mismo problema, pero creo que es mejor resumir e introducir el último paso para que funcione:

  1. Agregue el setHasOptionsMenu(true) en el método onCreate(Bundle savedInstanceState) su Fragmento.

  2. onCreateOptionsMenu(Menu menu, MenuInflater inflater) (si desea hacer algo diferente en el menú de su Fragmento) y onOptionsItemSelected(MenuItem item) en su Fragmento.

  3. Dentro del onOptionsItemSelected(MenuItem item) Activity onOptionsItemSelected(MenuItem item) , asegúrese de devolver false cuando la acción del elemento de menú se implemente en el onOptionsItemSelected(MenuItem item) elemento de menú) de Fragment.

Un ejemplo:

Actividad

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Do Activity menu item stuff here return true; case R.id.fragment_menu_item: // Not implemented here return false; default: break; } return false; } 

Fragmento

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); .... } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // Do something that differs the Activity's menu here super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.activity_menu_item: // Not implemented here return false; case R.id.fragment_menu_item: // Do Fragment menu item stuff here return true; default: break; } return false; } 

He notado que la solución que la gente le dio fue implementar el código para su elemento de menú en la actividad en lugar del fragmento. Creo que se verá mucho más útil si has implementado el código en el fragmento en lugar de la actividad porque, en mi opinión, se ve mejor. Para hacerlo, haz lo siguiente:

Actividad

 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.SomeIDInTheMenueOfTheActivity: { //something(); break; } default: //do something default and add the code under : return super.onOptionsItemSelected(item); } return true; } 

Fragmento

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.SomeIDInFragmentMenue: { break; } default: return super.onOptionsItemSelected(item); } return true; } 

Ahora las líneas (y los me gusta): “return super.onOptionsItemSelected (item);” en la actividad y el fragmento son muy importantes, porque como si siguieras el código en depuración, verás que las funciones de eventos menue serán llamadas primero en la Actividad, y si el ítem no coincide con las identificaciones en el cambio de actividad case, the degault line: “super.onOptionsItemSelected (item);” llamará a la función onOptionsItemSelected en el fragmento, como queríamos. (si tiene muchos fragmentos, asegúrese de tener esa línea también, ya que la hirarquía de llamada puede ser algo complicada).

Estoy usando actionbarsherlock. Esto funcionó para mí:

1) Crear menú dummy_menu.xml

 < ?xml version="1.0" encoding="utf-8"?>   

2) En la actividad inflar el menú de esta manera:

 @Override public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) { com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.dummy_menu,menu); return super.onCreateOptionsMenu(menu); } 

3) En los fragmentos de la llamada a CreenteView setHasOptionsMenu (true) y anula onCreateOptionsMenu y onOptionsItemSelected también oculta el dummyMenu como este (en fragmento)

  @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_actions, menu); MenuItem item = menu.findItem(R.id.dummyMenu); item.setVisible(false); super.onCreateOptionsMenu(menu, inflater); } 

Espero que ayude a alguien.

Editar para el uso de sherlock de la barra de acciones

Tuve que usar

 public boolean onMenuItemSelected(int featureId, MenuItem item) { 

en la actividad principal para capturar el elemento del menú

es tan simple que puedes hacer eso en tu fragmento para asegurarte de que tu acción va a escuchar correctamente:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } 

Tuve este problema Fue porque estaba superando el método equivocado

onOptionsItemSelected (elemento com.actionbarsherlock.view.MenuItem) es lo que usé.

¡Asegúrate de estar usando el correcto!

No estás encadenando a la superclase en los métodos de actividad. Tenga onCreateOptionsMenu () devuelva super.onCreateOptionsMenu (menú) y tenga onOptionsItemSelected () return super.onOptionsItemSelected (item) (excepto para el elemento que está manipulando, que debe devolver verdadero para indicar que ha manejado el evento)