Im Moment habe ich also eine Aktivität, die von zwei verschiedenen Aktivitäten aus erreicht werden kann. Das Problem ist, dass ich nur eine Aktivität als übergeordnete Aktivität in der Manifest-XML-Datei festlegen kann. Offensichtlich ist dies ein schlechtes UX / UI-Design, da die Aktivität den Benutzer möglicherweise zu der falschen Aktivität zurückleitet, bei der er zuvor war, und daher versuche ich, dynamisch festzulegen, welche Aktivität die übergeordnete Aktivität ist.
Das Problem ist, dass ich nicht ganz sicher bin, wie ich vorgehen soll, ob im Code oder in XML, also sind alle Hinweise willkommen. 🙂
Übergeordnete Aktivitäten werden für die Aufwärtsnavigation verwendet (z. B. der Aufwärtspfeil in der Aktionsleiste). Die Rückwärtsnavigation verwendet keine übergeordneten Aktivitäten, sondern den Backstack. In Ihrem Fall sollten Sie mit der Verwendung gut zurechtkommen startActivity(ForResult) und finish um den Backstack zu verwalten.
– Mattias Bülens
4. Oktober 2013 um 15:00 Uhr
Ich würde gerne den Aufwärtspfeil in der Aktionsleiste verwenden, also denke ich, was ich wirklich suche, ist eine Möglichkeit, dynamisch festzulegen, auf welche Aktivität sich die Aufwärtsnavigation beziehen soll, wenn sie berührt wird.
– Darryl Bayliss
4. Oktober 2013 um 15:06 Uhr
Eine weitere verwandte Frage – ebenfalls ohne wirkliche Antwort: Wie setze ich die übergeordnete Aktivität einer Aktivität zur Laufzeit?
– Richard Le Mesurier
3. Juli 2014 um 11:22 Uhr
Für zukünftige Leser ist hier ein Beispiel dafür, wie die offizielle/richtige Lösung gemäß der implementiert werden kann Entwicklerhandbücher (scrollen Sie zu dem Absatz, der mit beginnt „Das ist angemessen, wenn Die Elternaktivität kann unterschiedlich sein …“).
Beachten Sie, dass diese Lösung davon ausgeht, dass Sie die verwenden Bibliothek unterstützen zur Umsetzung Ihrer ActionBar und dass Sie zumindest eine „standardmäßige“ übergeordnete Aktivität in Ihrer Manifest-XML-Datei festlegen können, auf die zurückgegriffen werden soll, wenn sich die Aktivität, von der Sie sich zurückziehen, in einer „Aufgabe“ befindet, die nicht zu Ihrer App gehört (lesen Sie die verknüpften Dokumente zur Klärung ).
// Override BOTH getSupportParentActivityIntent() AND getParentActivityIntent() because
// if your device is running on API 11+ it will call the native
// getParentActivityIntent() method instead of the support version.
// The docs do **NOT** make this part clear and it is important!
@Override
public Intent getSupportParentActivityIntent() {
return getParentActivityIntentImpl();
}
@Override
public Intent getParentActivityIntent() {
return getParentActivityIntentImpl();
}
private Intent getParentActivityIntentImpl() {
Intent i = null;
// Here you need to do some logic to determine from which Activity you came.
// example: you could pass a variable through your Intent extras and check that.
if (parentIsActivityA) {
i = new Intent(this, ActivityA.class);
// set any flags or extras that you need.
// If you are reusing the previous Activity (i.e. bringing it to the top
// without re-creating a new instance) set these flags:
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
// if you are re-using the parent Activity you may not need to set any extras
i.putExtra("someExtra", "whateverYouNeed");
} else {
i = new Intent(this, ActivityB.class);
// same comments as above
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
i.putExtra("someExtra", "whateverYouNeed");
}
return i;
}
HINWEIS: Wenn Sie in der Manifest-XML-Datei keine standardmäßige übergeordnete Aktivität festlegen, müssen Sie diese ebenfalls implementieren onCreateSupportNavigateUpTaskStack() da das System keine Ahnung hat, wie es einen Backstack für Ihre Aufgabe generieren soll. Ich habe kein Beispiel für diesen Teil bereitgestellt.
Meine Gedanken zum finish() Typ Lösungen
Auf meiner Suche nach einer Lösung für dieses Problem bin ich auf einige Antworten gestoßen, die für die Strategie des Überschreibens plädieren onOptionsItemSelected() und Abfangen der android.R.id.home Knopf, damit sie einfach konnten finish() die jetzige Activity um zum vorherigen Bildschirm zurückzukehren.
In vielen Fällen wird dies das gewünschte Verhalten erreichen, aber ich möchte nur darauf hinweisen, dass dies definitiv der Fall ist nicht das gleiche wie eine richtige UP-Navigation. Wenn Sie über eine der übergeordneten Aktivitäten zur untergeordneten Aktivität navigiert sind, dann ja finish() bringt Sie zum richtigen vorherigen Bildschirm zurück, aber was ist, wenn Sie die untergeordnete Aktivität über eine Benachrichtigung eingegeben haben? In diesem Fall finish()Wenn Sie die UP-Taste drücken, gelangen Sie direkt zurück auf den Startbildschirm oder in die App, die Sie angezeigt haben, bevor Sie auf die Benachrichtigung geklickt haben, obwohl Sie stattdessen zu einer richtigen übergeordneten Aktivität in Ihrer App hätten weitergeleitet werden sollen.
Vielen Dank für das Bereitstellen eines Beispiels dafür, wie dies geschehen sollte – das fehlt tatsächlich in den Android-Richtlinien.
– Benutzer1419999
23. Mai 2015 um 3:30 Uhr
getSupportParentActivityIntent wird bei API 15-Geräten nicht ausgelöst … irgendwelche Ideen?
– hat funktioniert
10. Oktober 2015 um 14:49 Uhr
@worked es erscheint basierend auf der Antwort, dass getSupportParentActivityIntent() nur auf Geräten ausgelöst werden sollte, auf denen < API 11 ausgeführt wird.
Auf diese Weise können Sie dynamisch zu Ihrer übergeordneten Aktivität navigieren:
getActionBar().setDisplayHomeAsUpEnabled(true);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
HINWEIS: Es leitet Sie zu der Aktivität oder dem Fragment weiter, von dem Sie gekommen sind, unabhängig davon, ob es sich um ein übergeordnetes Element handelt oder nicht. Durch Klicken auf die Aufwärts-/Pos1-Schaltfläche der Aktionsleiste wird die aktuelle Aktivität einfach beendet.
Es ist nicht gerade Elternaktivität, aber es funktioniert großartig.
– Himmelswand
14. November 2014 um 10:52 Uhr
Für diejenigen, die lesen, während finish() in vielen Situationen das gewünschte Verhalten erzielt, wird es in manchen Fällen nicht immer zu einer korrekten UP-Navigation führen. Bitte sehen Sie sich meine Antwort und Gedanken an, die dies erklären.
– Toni Chan
5. Februar 2015 um 1:50 Uhr
Die Rückgabe wahr ist ein sehr wichtiger Aspekt. Ich hatte das Ziel, aber keine Rückkehr wahr. Funktioniert jetzt. Vielen Dank
– Zapnologica
14. Oktober 2015 um 17:42 Uhr
Was ist der Unterschied zwischen finish() und NavUtils.navigateUpFromSameTask
– chrisonline
5. Februar 2016 um 15:56 Uhr
@nuttynibbles finish schließt die aktuelle Aktivität. Es ist nicht die richtige Art, die Aufwärtsnavigation zu verwenden.
– Vinzenz D.
8. März 2017 um 20:03 Uhr
Tasso Bassoukos
Hier sind zwei Konzepte im Spiel: „Oben“ und „Zurück“. „Zurück“ ist das Offensichtliche: bringt mich dorthin, wo ich war, kurz bevor ich hierher kam. Normalerweise müssen Sie sich nicht um „Zurück“ kümmern, da das System damit problemlos umgehen kann. „Nach oben“ ist nicht so offensichtlich – es ist analog zum Herauszoomen – von einem Element zur Sammlung, von einem Detail zum Gesamtbild.
Welche davon passt zu Ihrem Anwendungsfall?
Wie im Kommentar unten: Die Aufwärtstaste zieht das Ziel aus dem Android-Manifest, aber es kann sein programmgesteuert angepasst.
Ich bin mehr daran interessiert, das Rückenverhalten zu handhaben, aber Ihrer Beschreibung nach sollte das System dies automatisch handhaben? Was ist mit der Schaltfläche “Nach oben” in der Aktionsleiste, zieht diese ihr Ziel aus dem XML-Elternsatz oder verlinkt sie einfach zurück zu der vorherigen Aktivität, von der sie kam?
– Darryl Bayliss
4. Oktober 2013 um 15:53 Uhr
Ja, die Aufwärtstaste zieht das Ziel aus dem Android-Manifest, aber es kann sein programmgesteuert angepasst.
– Tassos Bassoukos
4. Oktober 2013 um 15:57 Uhr
Wenn Sie es mit Ihrer App ernst meinen, lesen Sie auch die Navigationsdesign-Leitfaden – Den Fluss beizubehalten wird wirklich dazu beitragen, dass sich eine App natürlich anfühlt. Glauben Sie nicht, dass Sie alles auswendig wissen müssen, sondern seien Sie sich bewusst, dass es einen Weg gibt, wie die Dinge erledigt werden.
– Tassos Bassoukos
4. Oktober 2013 um 16:04 Uhr
Warum wird diese Antwort ohne Kommentare mit -2 bewertet? Der Poster hätte ein Beispiel anstelle eines Links hinzufügen sollen, aber der Link führt zur richtigen Handbuchseite. +1
– John
29. Oktober 2014 um 2:33 Uhr
Diese Antwort sollte wahrscheinlich ein nettes Beispiel enthalten, anstatt nur den Link, der in Zukunft sterben könnte. Aber ich gebe diesem eine +1, um die Punktzahl wieder positiv zu machen, wo sie hingehört, da sie mich im Gegensatz zu einigen der anderen gegebenen Antworten zu einer wirklich richtigen Lösung geführt hat.
– Toni Chan
4. Februar 2015 um 1:34 Uhr
Die zu überschreibende Methode ist getParentActivityIntent.
Hier ist mein Code und funktioniert einwandfrei.
@Override
public Intent getParentActivityIntent() {
Intent parentIntent= getIntent();
String className = parentIntent.getStringExtra("ParentClassSource");
Intent newIntent=null;
try {
//you need to define the class with package name
newIntent = new Intent(OnMap.this, Class.forName(className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return newIntent;
}
Von den Elternaktivitäten;
Intent i = new Intent(DataDetailsItem.this, OnMap.class);
i.putExtra("ParentClassSource", "com.package.example.YourParentActivity");
startActivity(i);
Beachten Sie, dass der obige Android Dev Guide einen großen Fehler aufweist, da die NavUtils-Funktionen für ICS (und niedriger) und JellyBean (und höher) unterschiedlich funktionieren. Dieser Fehler in NavUtils wird hier wunderbar erklärt.
Pirdad Sachizada
Im Allgemeinen muss eine Aktivität vom Typ „Detail“ die „Aufwärts“-Navigation bereitstellen, wenn sie verschachtelte/zusammenhängende Inhalte hat. Die „Zurück“-Navigation wird vom System übernommen, sodass Sie sich wirklich keine Gedanken darüber machen müssen.
Für den zusätzlichen Aufwand zur Unterstützung der “Aufwärts”-Navigation gibt es einige Möglichkeiten, dies zu tun:
Aktivität, für die die übergeordnete Aktivität im AndroidManifest definiert ist.
Your Android Manifest
---------------------
<activity
android:name="com.example.app.DetailActivity"
android:parentActivityName="com.example.app.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.app.MainActivity" />
</activity>
Your Detail Activity
--------------------
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Dies funktioniert gut, wenn es nur eine übergeordnete Aktivität gibt, was bedeutet, dass (DetailActivity) immer von (MainActivity) gestartet wird. Andernfalls funktioniert diese Lösung nicht, wenn (DetailActivity) von verschiedenen Orten aus gestartet wird. Mehr hier: http://developer.android.com/training/implementing-navigation/ancestral.html
(Einfachere und empfohlene) Aktivität mit Fragment und Fragment Back-Stack:
Your Detail Activity
--------------------
protected void replaceFragment(Bundle fragmentArguments, boolean addToBackStack) {
DetailFragment fragment = new DetailFragment();
fragment.setArguments(fragmentArguments);
// get your fragment manager, native/support
FragmentTransaction tr = fragmentManager.beginTransaction();
tr.replace(containerResId, fragment);
if (addToBackStack) {
tr.addToBackStack(null);
}
tr.commit();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
Wenn der Benutzer bei dieser Lösung „Zurück“ drückt, wird das Fragment aus dem Fragment-Backstack entfernt und der Benutzer wird zum vorherigen Fragment zurückgebracht, während er weiterhin in derselben Aktivität bleibt. Wenn der Benutzer die ‘Hoch’-Taste drückt, wird die Aktivität geschlossen und der Benutzer wird zurück zur vorherigen Aktivität (der übergeordneten Aktivität) geführt. Der Schlüssel hier ist, das Fragment als Ihre Benutzeroberfläche und die Aktivität als Host des Fragments zu verwenden.
Hoffe das hilft.
Abdallah Abdelazim
Sie können die Aufwärts-Taste so überschreiben, dass sie sich wie die Zurück-Taste verhält:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
Übergeordnete Aktivitäten werden für die Aufwärtsnavigation verwendet (z. B. der Aufwärtspfeil in der Aktionsleiste). Die Rückwärtsnavigation verwendet keine übergeordneten Aktivitäten, sondern den Backstack. In Ihrem Fall sollten Sie mit der Verwendung gut zurechtkommen
startActivity(ForResult)
undfinish
um den Backstack zu verwalten.– Mattias Bülens
4. Oktober 2013 um 15:00 Uhr
Ich würde gerne den Aufwärtspfeil in der Aktionsleiste verwenden, also denke ich, was ich wirklich suche, ist eine Möglichkeit, dynamisch festzulegen, auf welche Aktivität sich die Aufwärtsnavigation beziehen soll, wenn sie berührt wird.
– Darryl Bayliss
4. Oktober 2013 um 15:06 Uhr
Eine weitere verwandte Frage – ebenfalls ohne wirkliche Antwort: Wie setze ich die übergeordnete Aktivität einer Aktivität zur Laufzeit?
– Richard Le Mesurier
3. Juli 2014 um 11:22 Uhr