Ich habe 2 Aktivitäten (A und B) in meiner Android-Anwendung und ich habe die Absicht, von Aktivität A zu Aktivität B zu gelangen. Die Verwendung von parent_activity ist aktiviert:
<activity
android:name=".B"
android:label="B" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app_name.A" />
</activity>
Ich benutze auch ein Thema, das einen UP-Button bietet.
Nachdem ich Aktivität BI aufgerufen habe, kann ich mit der UP-Taste zur Aktivität A zurückkehren. Das Problem ist, dass die Anwendung die onCreate () -Funktion von Aktivität A erneut aufzurufen scheint und dies nicht das Verhalten ist, das ich benötige. Ich brauche Aktivität A, um so auszusehen, wie sie aussah, bevor ich Aktivität B anrief.
Gibt es einen Weg, dies zu erreichen?
Danke im Voraus
BEARBEITEN:
Ich habe keinen Code geschrieben, um Aktivität B von Aktivität A aus zu starten. Ich denke, er wird durch Eclipse automatisch generiert.
Klasse B sieht aus wie:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Antworten:
Sie haben Aktivität A mit dem Standard
launchMode
im Android-Manifest deklariert . Laut Dokumentation bedeutet dies Folgendes:Daher ist das System gezwungen, Aktivität A (dh Aufrufen
onCreate
) neu zu erstellen, selbst wenn der Taskstapel korrekt behandelt wird.Um dieses Problem zu beheben, müssen Sie das Manifest ändern und der A-Aktivitätsdeklaration das folgende Attribut hinzufügen:
Hinweis: Das Aufrufen
finish()
(wie zuvor als Lösung vorgeschlagen) funktioniert nur, wenn Sie völlig sicher sind , dass die Instanz von Aktivität B, die Sie beenden, über einer Instanz von Aktivität A liegt. In komplexeren Workflows (z. B. Starten von Aktivität B über eine Benachrichtigung) Dies ist möglicherweise nicht der Fall und Sie müssen Aktivität A von B aus korrekt starten.quelle
navigateUpFromSameTask(...)
sollte das HinzufügenFLAG_ACTIVITY_CLEAR_TOP
zuupIntent
(übernavigateUpTo(...)
dem in gleiche Verhalten (gemäß führen sollte dieses Handbuch ), aber die Fahne ist nicht gesetzt - und damit diese Antwort macht SinnAktualisierte Antwort: Up Navigation Design
Sie müssen angeben, welche Aktivität für jede Aktivität das entsprechende übergeordnete Element ist. Auf diese Weise kann das System Navigationsmuster wie Up vereinfachen, da das System die logische übergeordnete Aktivität aus der Manifestdatei ermitteln kann.
Dazu müssen Sie Ihre übergeordnete Aktivität im Tag Aktivität mit Attribut deklarieren
android:parentActivityName
Mögen,
Wenn die übergeordnete Aktivität auf diese Weise deklariert wurde, können Sie wie unten beschrieben zu dem entsprechenden übergeordneten Element navigieren.
Wenn Sie
NavUtils.navigateUpFromSameTask(this);
diese Methode aufrufen , wird die aktuelle Aktivität beendet und die entsprechende übergeordnete Aktivität gestartet (oder fortgesetzt). Befindet sich die übergeordnete Zielaktivität im Backstack der Aufgabe, wird sie wie in definiert durch vorgezogenFLAG_ACTIVITY_CLEAR_TOP
.Und um die Schaltfläche Nach oben anzuzeigen, müssen Sie deklarieren
setDisplayHomeAsUpEnabled():
Alte Antwort: (Ohne Up-Navigation, Standard-Back-Navigation)
Dies geschieht nur, wenn Sie Aktivität A erneut von Aktivität B aus starten.
Verwenden von
startActivity()
.Starten Sie stattdessen ab Aktivität A Aktivität B, indem Sie Aktivität A verwenden
startActivityForResult()
und überschreibenonActivtyResult()
.Rufen Sie jetzt in Aktivität B einfach die
finish()
Schaltfläche Nach oben auf. Nun haben Sie zu Aktivität A gewechselt,onActivityResult()
ohne erneut Aktivität A zu erstellen.quelle
NavUtils.navigateUpFromSameTask(this);
schreibenfinish()
.finish()
oderstartActivityForResult()
in seiner Dokumentation zur Navigation ( developer.android.com/design/patterns/navigation.html ) erwähnt.Ich hatte so ziemlich das gleiche Setup, was zu dem gleichen unerwünschten Verhalten führte. Für mich hat dies funktioniert: Hinzufügen des folgenden Attributs zu einer Aktivität A in
Manifest.xml
meiner App:Weitere Erklärungen finden Sie in diesem Artikel .
quelle
Obwohl es sich um eine alte Frage handelt, ist hier eine andere (imho die sauberste und beste) Lösung, da alle vorherigen Antworten für mich nicht funktionierten, da ich Aktivität B von einem Widget entfernt habe .
[ https://stackoverflow.com/a/31350642/570168 ]
Siehe aber auch: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android
quelle
Ein besserer Weg, dies zu erreichen, besteht darin, zwei Dinge zu verwenden: call:
Damit dies funktioniert, muss in Ihrer Manifestdatei angegeben sein, dass Aktivität A eine übergeordnete Aktivität B hat. Die übergeordnete Aktivität benötigt nichts. In Version 4 und höher erhalten Sie ohne zusätzlichen Aufwand einen schönen Rückpfeil (dies kann auch bei niedrigeren Versionen mit ein wenig Code durchgeführt werden, ich werde es unten einfügen). Sie können diese Daten auf der Registerkarte Manifest-> Anwendung festlegen in der GUI (scrollen Sie nach unten zum Namen der übergeordneten Aktivität und geben Sie ihn von Hand ein)
Unterstützungsknoten:
Wenn Sie eine Version unter Version 4 unterstützen möchten, müssen Sie auch Metadaten einschließen. Klicken Sie mit der rechten Maustaste auf die Aktivität, fügen Sie-> Metadaten hinzu, name = android.support.PARENT_ACTIVITY und value = your.full.activity.name
um den schönen Pfeil auch in niedrigeren Versionen zu bekommen:
Bitte beachten Sie, dass Sie die Support-Bibliothek Version 7 benötigen, damit dies alles funktioniert, aber es lohnt sich!
quelle
Was für mich funktionierte, war das Hinzufügen von:
zu
TheRelevantActivity.java
und jetzt funktioniert es wie erwartetund ja, vergiss nicht hinzuzufügen:
getSupportActionbar.setDisplayHomeAsUpEnabled(true);
inonCreate()
Methodequelle
Ich habe es versucht
android:launchMode="singleTask"
, aber es hat nicht geholfen. Arbeitete für mich mitandroid:launchMode="singleInstance"
quelle
Ändern Sie die Antwort von @ LorenCK und ändern Sie sie
Klicken Sie auf den folgenden Code, wenn Ihre Aktivität von einer anderen Aktivität aus initiiert werden kann und dies Teil einer Aufgabe werden kann, die von einer anderen App gestartet wurde
Dadurch wird eine neue Aufgabe gestartet und die übergeordnete Aktivität Ihrer Aktivität gestartet, die Sie im Manifest wie unten in Min SDK Version <= 15 definieren können
Oder verwenden,
parentActivityName
wenn es> 15 istquelle
parentActivityName
für SDK> 15, sonst kommt es zu zufälligen AbstürzenIch hatte ein ähnliches Problem mit Android 5.0 mit einem schlechten Namen der Elternaktivität
Ich habe die Datei com.example.myfirstapp aus dem Namen der übergeordneten Aktivität entfernt und sie hat ordnungsgemäß funktioniert
quelle
Fügen Sie Ihrer Aktivität Manifestinformationen mit Attribut hinzu
arbeitet gut für mich
quelle
In der Java-Klasse: -
Im Manifest: -
Es wird dir helfen
quelle
wie ein Zurück drücken
quelle
Versuche dies:
quelle
In mein Manifest zu gehen und
android:launchMode="singleTop"
die Aktivität zu erweitern, hat den Trick für mich getan.Dies löste speziell mein Problem, da ich nicht wollte, dass Android eine neue Instanz der vorherigen Aktivität erstellt, nachdem
Up
ich auf die Schaltfläche in der Symbolleiste geklickt hatte. Stattdessen wollte ich die vorhandene Instanz der vorherigen Aktivität verwenden, als ich die Navigationshierarchie aufstieg.Referenz: android: launchMode
quelle
Versuchen Sie diese Lösung mit NavUtils.navigateUpFromSameTask (this); in der untergeordneten Aktivität: https://stackoverflow.com/a/49980835/7308789
quelle