EDITAR: Esta pregunta fue para la barra de acciones de Sherlock obsoleta. La biblioteca de soporte de Android debería usarse ahora
He agregado una opción de menú de la barra de acción llamada compartir para mi fragment
que aparece pero el evento de selección no se detecta
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 el fragment activity
similar
@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 tengo setHasOptionsMenu(true);
en el onCreate()
.
fuente
Tuve el mismo problema, pero creo que es mejor resumir e introducir el último paso para que funcione:
Agregue
setHasOptionsMenu(true)
método en el método de su FragmentoonCreate(Bundle savedInstanceState)
.Anular
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(si desea hacer algo diferente en el menú de su Fragmento) yonOptionsItemSelected(MenuItem item)
métodos en su Fragmento.Dentro del
onOptionsItemSelected(MenuItem item)
método de su actividad , asegúrese de regresarfalse
cuando la acción del elemento del menú se implementaría en elonOptionsItemSelected(MenuItem item)
método 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; }
fuente
return false
en ActivityonOptionItemSelected
es la clave. simplemente reemplacereturn super.onOptionItemSelected(item);
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 organizado si hubiera implementado el código en el fragmento en lugar de la actividad porque, en mi opinión, se ve mejor. Para hacerlo, haga 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 súper importantes, porque como si siguiera el código en la depuración, verá que las funciones de eventos del menú se llamarán primero en la Actividad, y si el elemento no coincide con los ID en el interruptor de la actividad- caso, la línea degault: "super.onOptionsItemSelected (item);" llamará a la función onOptionsItemSelected en el fragmento, como queríamos. (si tiene muchos fragmentos, asegúrese de incluir esa línea también, ya que la jerarquía de llamadas puede ser algo complicada).
fuente
Estoy usando actionbarsherlock. Esto funcionó para mí:
1) Crear menú dummy_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" > <item android:title="" android:showAsAction="never" android:id="@+id/dummyMenu" />
2) En actividad, infle 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 onCreateView, llame a setHasOptionsMenu (verdadero) y anule onCreateOptionsMenu y onOptionsItemSelected también oculte el dummyMenu así (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.
fuente
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ú
fuente
onContextItemSelected
lugar deonOptionsItemSelected
. ElonMenuItemSelected
simplemente reenvía el clic con el método correcto, por lo que parece funcionar mejor.es tan simple que puede hacer eso en su fragmento para asegurarse de que su acción se escuche correctamente:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); }
fuente
Tuve este problema. Fue porque estaba superando el método equivocado
onOptionsItemSelected (elemento com.actionbarsherlock.view.MenuItem) es lo que utilicé.
¡Asegúrate de usar el correcto!
fuente
No se está encadenando a la superclase en los métodos de actividad. Haga que onCreateOptionsMenu () devuelva super.onCreateOptionsMenu (menú), y que onOptionsItemSelected () devuelva super.onOptionsItemSelected (elemento) (excepto el elemento que está manejando, que debe devolver verdadero para indicar que ha manejado el evento)
fuente
debe agregar este código en la
toolbar.bringToFront();
siguiente barra de herramientas en su actividadpublic class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { ... Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle("Yazd"); setSupportActionBar(toolbar); toolbar.bringToFront(); // <<= add here ...
fuente