2017-08-09 1 views
0

Ich habe eine Aktivität (AppCompatActivity) (namens Activity) und zwei Fragmente (Fragment A und Fragment B genannt).Android-Menü in Fragment nicht Reaload

Wenn Aktivität gestartet wird, verwende ich setContentView und Fragment A wurde generiert.

Wenn ich versuche, Aktivität mit bestimmten Parameter I Mittagessen Fragment B zu starten. Fragment A und Fragment B hat das gleiche Layout, ich ändere nur die zu rendernden Daten.

In Fragment A habe ich ein Menü mit 1 Element, dieses führt eine Aktion in meiner Ansicht aus: Liste in ein Rasterlayout ändern.

In Fragment B habe ich auch dieses Menü, aber wenn ich auf den Eintrag klicke ändert sich nichts. Also ich habe das im Debug-Modus versucht. Ich habe gesehen, dass, wenn ich im Menü Element für Fragment B drücke, diese Menüaktion von Fragment A aufgerufen wird.

Wie kann ich diesen Zyklus auflösen?

+0

Ich kann Ihnen helfen, Ihren Code hier, dies kann helfen: nicht super von onCreateOptionsMenu in Ihren Fragmenten – stallianz

+0

aufrufen Ich schlage vor, Sie OnCreateOptionsMenu() -Methode in beiden Fragment überschreiben und behandeln an beiden Stellen aus Fragment statt Aktivität. –

+0

Wenn du sagst "Wenn ich versuche, Aktivität mit spezifischem Parameter I zu beginnen, lunch Fragment B", heißt das, dass du ** sowohl ** Fragment A und Fragment B, als auch ** nur ** Fragment B startest? –

Antwort

1

Wenn Sie einen Menüeintrag auswählen, sendet das System dieses Ereignis an den aktiven Activity sowie alle derzeit aktiven Fragment s. Das Ereignis wird an die Fragmente in der Reihenfolge gesendet, in der sie der Aktivität hinzugefügt wurden.

Wenn Fragment A und Fragment B beide gehören onOptionsItemSelected()-Implementierung, die die gleiche R.id Konstante behandelt, wird dies das Problem verursachen Sie sehen.

Zum Beispiel vorstellen, Fragment A hat diesen Code:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.action_settings) { 
     // do some Fragment A thing 
    } 
    ... 
} 

Und Fragment B vorstellen, hat diesen Code:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.action_settings) { 
     // do some Fragment B thing 
    } 
    ... 
} 

Auch wenn der Benutzer klickt auf R.id.action_settings innerhalb Fragment B, wird das System Versende das Ereignis nach Fragment A und Fragment A wird es glücklich behandeln!

Es gibt einige verschiedene Lösungen für dieses Problem.

Zuerst können Sie Ihre Menüs in Ihren zwei Fragmenten ändern, so dass sie dieselben Textbeschriftungen haben, aber unterschiedliche android:id Attribute verwenden (und dann Ihren Fragmentcode entsprechend aktualisieren). Jetzt wird nur das "richtige" Fragment in der Lage sein, das Elementauswahlereignis zu handhaben.

Zweitens könnten Sie Ihre onOptionsItemSelected() Code bestimmen aktualisieren, ob das Fragment gerade aktiv ist, und das Ereignis zu ignorieren, wenn dies nicht der Fall:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (!isAdded() || !isVisible()) { 
     return false; 
    } 

    if (item.getItemId() == R.id.action_settings) { 
     // do some Fragment A thing 
    } 
} 

Schließlich Sie dynamisch generierte IDs für Ihre Menüpunkte verwenden könnte . Ich würde diesen Ansatz empfehlen, da es viel komplizierter ist als die anderen.

Verwandte Themen