(Deprecated) Frammento onOptionsItemSelezionato non chiamato

EDIT: Questa domanda è stata per la barra d'azione dello squalo deprecata. Ora dovrebbe essere utilizzata la libreria di supporto Android

Ho aggiunto un'opzione di menu della barra delle azioni denominata azione per il mio fragment che appare ma l'evento di selezione non viene catturato

  • Modo migliore per la modifica dell'input di valuta editText?
  • Formatta la carta di credito nel text di modifica in android
  • L'avviso mostra quando utilizzo Hash Map in android (Utilizza nuovo SparseArray <String>)
  • Controllare se l'applicazione è installata - Android
  • Ombra Marker MapView
  • "Codice di errore 5: database è bloccato" quando si utilizza un ContentProvider
  • Lo sto aggiungendo così

     @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); } 

    Cercando di catturarla sia nel fragment activity come

     @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); } } 

    e ho setHasOptionsMenu(true); in onCreate() .

  • Rileva l'attività degli utenti in android
  • Fotocamera Android: intent di dati restituisce null
  • bypass il dialogo di conferma delle autorizzazioni host di android usb
  • Deserializzazione di un tag XML con i sottotitoli di text AND utilizzando Retrofit
  • Come get l'arrays JSON all'interno dell'object JSON?
  • Come impostare un button grigio e incrollabile?
  • 8 Solutions collect form web for “(Deprecated) Frammento onOptionsItemSelezionato non chiamato”

    Gli stessi problemi mi sono accaduti:

    gli events onMenuItemSelected non sono stati chiamati in Frammento

    Google ricerca non può trovare una soluzione e aggiungere il metodo OnMenuItemSelected in FragmentActivity non lo risolve.

    Finalmente risolvere il problema seguendo il riferimento a http://developer.android.com/guide/topics/ui/actionbar.html

    Nota: Se si aggiunge la voce di menu da un frammento, tramite la callback onCreateOptionsMenu della class Fragment, il sistema chiama il relativo metodo onOptionsItemSelected () per quel frammento quando l'utente seleziona uno degli elementi del frammento. Tuttavia l'attività ha la possibilità di gestire l'evento innanzitutto, quindi il sistema invita onOptionsItemSelected () sull'attività prima di call lo stesso richiamo del frammento.

    Ciò significa solo se non si dispone di quel gestore di elementi di menu in onOptionsItemSelected () sull'attività, verrà chiamato onOptionsItemSelected () sul frammento.

    Codice come seguente —– Rimuovi il gestore per R.action.add su 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); } } 

    E il gestore di R.action.add sul frammento sembra così:

     @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); } } 

    Infine, ricorda di aggiungere

      setHasOptionsMenu(true); 

    nel metodo onCreate in Frammento

    Ho avuto lo stesso problema, ma penso che sia meglio riassumere e introdurre l'ultimo passo per farlo funzionare:

    1. Aggiungere il setHasOptionsMenu(true) nel metodo onCreate(Bundle savedInstanceState) del onCreate(Bundle savedInstanceState) .

    2. Sostituisci onCreateOptionsMenu(Menu menu, MenuInflater inflater) (se vuoi fare qualcosa di diverso nel menu Frammento) e onOptionsItemSelected(MenuItem item) nel frammento.

    3. All'interno del onOptionsItemSelected(MenuItem item) dell'attività, assicurati di restituire false quando l'azione dell'elemento di menu verrà implementata nel metodo onOptionsItemSelected(MenuItem item) Fragment.

    Un esempio:

    Attività

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

    Frammento

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

    Ho notato che la soluzione che la gente ha dato è stato quello di implementare il codice per il tuo articolo menu nell'attività anziché il frammento. Penso che sarà molto più organizzato se avessi implementato il codice nel frammento piuttosto che l'attività 'cos a mio parere sembra meglio. A tale scopo procedere come segue:

    Attività

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

    Frammento

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

    Ora le righe (e le coppie): "restituiscono super.onOptionsItemSelected (item);" nell'attività e nel frammento sono super importnti perché, come se seguireste il codice nel debug, vednetworking che le funzioni degli events di menù verranno chiamate per primo sull'attività e se l'elemento non corrisponde all'ID nell'interruttore dell'attività, caso, la linea di degault: "super.onOptionsItemSelected (item);" chiamerà la function onOptionsItemSelected sul frammento, come volevamo. (se avete molti frammenti, assicuratevi di avere quella linea in loro, come la chiamata di logaritmi può essere un po 'complicata).

    Sto usando actionbarsherlock. Questo ha funzionato per me:

    1) Crea menu 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) In attività gonfiare il menu come questo:

     @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) In frammenti onCreateView call setHasOptionsMenu (true) e override onCreateOptionsMenu e onOptionsItemSelected nascondono anche il dummyMenu come questo (in frammento)

      @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); } 

    Spero che aiuta qualcuno.

    Modifica per l'utilizzo dello sherlock della barra degli strumenti

    Ho dovuto usare

     public boolean onMenuItemSelected(int featureId, MenuItem item) { 

    nell'attività principale per catturare la voce di menu

    è così semplice che puoi farlo nel tuo frammento per assicurarvi che la tua azione ascolti correttamente:

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

    Ho avuto questo problema. Era perché stavo superando il metodo sbagliato

    onOptionsItemSelected (elemento com.actionbarsherlock.view.MenuItem) è quello che ho usato.

    Assicurati di utilizzare il giusto!

    Non stai incatenando la superclass nei methods di attività. Si prega di avere onCreateOptionsMenu () restituire super.onCreateOptionsMenu (menu) e avere onOptionsItemSelected () restituire super.onOptionsItemSelected (item) (ad exception dell'elemento che si sta gestendo, che dovrebbe restituire true per indicare di aver gestito l'evento)

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.