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.
Ich kann Ihnen helfen, Ihren Code hier, dies kann helfen: nicht super von onCreateOptionsMenu in Ihren Fragmenten – stallianz
aufrufen Ich schlage vor, Sie OnCreateOptionsMenu() -Methode in beiden Fragment überschreiben und behandeln an beiden Stellen aus Fragment statt Aktivität. –
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? –