Ich habe einen Suchbildschirm, der durch Klicken auf ein “Name”-Feld eines anderen Bildschirms gestartet werden kann.
Wenn der Benutzer diesem Workflow folgt, füge ich den Intent-Extras ein Extra namens “Suche” hinzu. Dieses Extra verwendet den Text, der das “Name”-Feld füllt, als seinen Wert. Wenn der Suchbildschirm erstellt wird, wird dieses Extra als Suchparameter verwendet und eine Suche wird automatisch für den Benutzer gestartet.
Da Android jedoch Aktivitäten zerstört und neu erstellt, wenn sich der Bildschirm dreht, führt das Drehen des Telefons erneut zu einer automatischen Suche. Aus diesem Grund möchte ich das Extra „Suchen“ aus der Absicht der Aktivität entfernen, wenn die anfängliche Suche ausgeführt wird.
Ich habe versucht, dies so zu tun:
Bundle extras = getIntent().getExtras();
if (extras != null) {
if (extras.containsKey("search")) {
mFilter.setText(extras.getString("search"));
launchSearchThread(true);
extras.remove("search");
}
}
Dies funktioniert jedoch nicht. Wenn ich den Bildschirm erneut drehe, ist das Extra „Suchen“ immer noch in den Extras der Absicht der Aktivität vorhanden.
Irgendwelche Ideen?
Andreas
Ich habe es funktioniert.
Es erscheint getExtras() erstellt eine Kopie der Extras des Intent.
Wenn ich die folgende Zeile verwende, funktioniert dies einwandfrei:
getIntent().removeExtra("search");
Quellcode von getExtras()
/**
* Retrieves a map of extended data from the intent.
*
* @return the map of all extras previously added with putExtra(),
* or null if none have been added.
*/
public Bundle getExtras() {
return (mExtras != null)
? new Bundle(mExtras)
: null;
}
Wenn Sie den Wert direkt nach dieser Zeile überprüfen, werden Sie feststellen, dass der Wert nicht aus der Absicht entfernt wurde. Ich habe es auf die gleiche Weise versucht und dann versucht zu sehen, ob die Absicht entfernt wurde oder nicht. getIntent().removeExtra(“Suche”); String searchText = extras.getString(“search”); Der Wert von searchText ist gleich. Ich habe versucht extras.remove(“search”); danach ist der Wert null.
– Anil Chahal
8. Dezember 2014 um 7:22 Uhr
@AnilChahal Es könnte sein, dass onNewIntent() in der Zwischenzeit aufgerufen wurde und Sie den tatsächlichen ‘Intent’-Wert überschrieben haben
– Tomi
24. Dezember 2014 um 17:00 Uhr
Eine gute Antwort finden Sie auch hier: stackoverflow.com/questions/20447643/… wenn jemand die Aktivitätsabsicht ändern möchte
– Gelldur
31. Juli 2015 um 11:29 Uhr
@Andrew Wie entferne ich JEDE Absicht und nicht nur eine Absicht, die durch einen bestimmten String-Wert definiert ist?
– Martin Erlic
26. November 2015 um 11:59 Uhr
@NewGuy hat das Häkchen bei dieser Antwort entfernt, da es nicht mehr funktioniert.
– Andreas
10. August 2018 um 15:39 Uhr
Während die Antwort von @Andrew ein Mittel zum Entfernen eines bestimmten Intent-Extras bieten kann, ist es manchmal notwendig, ALLE Intent-Extras zu löschen, und in diesem Fall möchten Sie sie verwenden
Intent.replaceExtras(new Bundle())
Quellcode von replaceExtras:
/**
* Completely replace the extras in the Intent with the given Bundle of
* extras.
*
* @param extras The new set of extras in the Intent, or null to erase
* all extras.
*/
public @NonNull Intent replaceExtras(@NonNull Bundle extras) {
mExtras = extras != null ? new Bundle(extras) : null;
return this;
}
Das Problem kann mit einem zusätzlichen Flag gelöst werden, das während Zerstörungen und Wiederherstellungen bestehen bleibt. Hier ist der eingegrenzte Code: