2013-08-08 9 views
17

Mein Fragment ersetzt die übergeordneten Aktivitätsoptionen durch ein bestimmtes Optionselement, aber wenn ich auf das Element klicke, wird nur die Aktivität onOptionItemSelected aufgerufen, obwohl ich die Methode in Fragment überschrieben habe. Fehle ich etwas?Fragments onOptionsArtSelected wird nicht aufgerufen

Fragment Methoden:

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

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 

    Log.d(TAG, "Fragment.onCreateOptionsMenu"); 

    if (mPasteMode) { 
     menu.clear(); 
     inflater.inflate(R.menu.contexual_paste, menu); 
     getActivity().getActionBar().setTitle("PasteMode"); 
    } 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Log.d(TAG, "Fragment.onOptionsItemSelected"); 

    switch (item.getItemId()) { 
     case R.id.context_action_paste: 
      Toast.makeText(getActivity(), 
        "It worked ", 
        Toast.LENGTH_SHORT).show(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

Aktivität Methoden:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    Log.d(TAG, "MainActivitiy.onOptionsItemSelected"); 
    switch (item.getItemId()) { 
     case R.id.action_refresh: 
      Toast.makeText(this, "Action Refresh selected", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      break; 
    } 
    return true; 
} 

Logcat Ausgang:

MainActivity.onCreateOptionsMenu 
Fragment.onCreateOptionsMenu 
MainActivitiy.onOptionsItemSelected 

Also wie kann ich die onOptionsItemSelected des Fragments genannt haben?

Antwort

30

In den Aktivitätsmethoden verketten Sie nicht zur Oberklasse. Bitte haben Sie onCreateOptionsMenu() zurückgeben super.onCreateOptionsMenu(menu), und onOptionsItemSelected() zurückgeben super.onOptionsItemSelected(item) (mit Ausnahme der Artikel, die Sie behandeln, die true zurückgeben sollte, um anzuzeigen, dass Sie das Ereignis behandelt haben).

+0

Danke, das hat das Problem gelöst. – Nima

+4

Es sollte beachtet werden, dass setHasOptionsMenu (true) im Fragment aufgerufen werden muss ist –

+0

Prost @ TashPemhiwa – Patric

26

Wenn Ihre Aktivität der onOptionsItemSelected Methode returs wahr, der Anruf in der Aktivität verbraucht wird und Fragment des onOptionsItemSelected wird nicht aufgerufen. Also, zurückgeben false in Ihrer Aktivität onOptionsItemSelected Methode oder Elternklasse Implementierung über super.onOptionsItemSelected Aufruf (Standardimplementierung gibt false zurück).

Nach Aktivitätsklasse javadoc, Methode Activity.onOptionsItemSelected sollte:

return false normale Menüverarbeitung ablaufen zu lassen, ist es wahr hier

+0

Vielen Dank, das ist sehr klare Antwort –

+0

Awesome, löste mein Problem !!! – Jenny

+0

Vielen Dank, dass Sie meine Zeit gespart haben. – Shailesh

5

In meinem Fall zu konsumieren habe ich hinzufügen, nicht Menüpunkte (dh ich habe weder in der Aktivität noch im Fragment onCreateOptionsMenu aufgerufen). Allerdings musste ich den Aktionsleisten-Home-Button im Fragment verwenden. Dafür musste ich sicherstellen, dass setHasOptionsMenu(true) in der onCreateView() Methode des Fragments aufgerufen wurde, bevor dies funktionieren könnte. Dann brauchte ich keinen onOptionsItemSelected Override in meiner Aktivität.