9

Ich habe eine Aktivität, die mehrere Fragmente enthalten kann. Jedes der Fragmente kann eigene Menüeinträge in der ActionBar haben. Dies funktioniert soweit und jedes Element ist anklickbar und führt die gewünschte Aktion aus.OnOptionsSetelected in Aktivität wird vor onOptionsItemSelected in Fragment aufgerufen. Andere Möglichkeit möglich?

Mein Problem ist das folgende. Im MainActivity erklärte ich die folgenden Zeilen Anrufe an die homeicon der ActionBar abfangen:

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      clearBackStack(); 
        setHomeFragment(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 

     } 
    } 

ich es in der Aktivität erklärt, weil ich, dass jedes Fragment wollte dies nennen sollte, so dass ich das nicht fangen müssen android.R.id.home Fall in jedem Fragment.

In einem Fragment verwende ich setDisplayHomeAsUpEnabled (true), so dass ich den kleinen Pfeil links von der ActionBar Icon bekomme. Wenn das HomeIcon in diesem Fragment geklickt wird, möchte ich das HomeFragment nicht einstellen, sondern das Fragment, das zuletzt angezeigt wurde. So habe ich ein onOptionsItemSelected - Methode in dem Fragment:

@Override 
public boolean onOptionsItemSelected(MenuItem menuItem) { 

    switch (menuItem.getItemId()) { 
    case android.R.id.home: 
     setLastFragment(); 
       return true; 
    ... 

Allerdings bedeutet dies nicht so funktionieren, ich wollte es arbeiten. Die Option onOptionsItemSelected der Aktivität wird zuerst aufgerufen, fängt das MenuItem ab und leitet zum HomeFragment um. Mit den anderen MenuItems, die in anderen Fragmenten deklariert sind, kann ich das gleiche Verhalten sehen. Aktivität wird zuerst aufgerufen, fängt das MenuItem nicht ab (Standardfall) und leitet dann zu super.onOptionsItemSelected (Element) um.

So scheint es, dass dies der Fall ist, wie Android die Menü-Klicks behandelt. Erste Aktivität, dann Fragment. Gibt es eine Möglichkeit, dies zu ändern? Ich möchte den android.R.id.home-case nicht in jedes Fragment einfügen und dort handhaben. Gibt es einen schöneren Weg, dies zu tun?

Antwort

4

Laut dem Entwickler Referenz,

„return false normale Menüverarbeitung zu ermöglichen, um wahr zu gehen, es hier zu konsumieren.“

So würde ich versuchen, ‚falsch‘ standardmäßig bei der Umsetzung von onOptionsItemSelected Aktivitäten zurückkehren(), auf diese Weise wird die Veranstaltung auf die Umsetzung des Fragment weitergeben, wenn sie nicht gefangen wird.

+9

Dies ist nicht das, was MrHill verlangte! Ich stehe vor dem gleichen Problem. Normalerweise behandelt die Aktivität die Schaltfläche "Home UP". Manchmal möchten wir spezielle Aktionen ausführen, wenn die Taste "Home UP" gedrückt wird, während ein bestimmtes Fragment gerade aktiv ist. Die Rückgabe von false für die Aktivität onOptionsItemSelected verhindert, dass die Aktivität den Fall behandelt. – John

1

Nicht sicher, ob es möglich ist. In den offiziellen Dokumenten finden Sie hier:

http://developer.android.com/guide/topics/ui/actionbar.html#ActionEvents

Es ist ein Hinweis, dass die folgenden Zustände:

[...] Allerdings wird die Aktivität eine Chance, das Ereignis zuerst zu handhaben, Daher ruft das System onOptionsSelected() für die Aktivität zuerst auf, bevor es den gleichen Callback für das Fragment aufruft.

+1

Es ** ist ** möglich, vorausgesetzt, Sie rufen 'setHasOptionsMenu (true)' während des frühen Teils des 'Fragment'-Lebenszyklus auf, z. in 'onCreateView()' –

8

Ich stoße gerade auf dieses Problem, und ich habe es mit dem folgenden Code funktioniert. In der onOptionsItemSelected Funktion Aktivität hinzufügen:

if (id == android.R.id.home){ 
     Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container); 
     if(null != currentFragment && currentFragment.onOptionsItemSelected(item)){ 
      return true; 
     } 
    } 

und in dem onOptionsItemSelected Methode des Fragments, behandeln Sie die entsprechenden Dinge. Wenn das Fragment für den Menüeintrag etwas zu tun hat, wird es dies tun und true zurückgeben, um jeden anderen Prozess zu stoppen. Und wenn das Fragment nichts mit diesem Element zu tun hat, gibt es false zurück oder ruft die super.onOptionsItemSelected-Methode auf, die eventuell false zurückgibt, damit andere es verarbeiten können.

Verwandte Themen