Dynamisch eingestellte Elternaktivität

Lesezeit: 9 Minuten

Benutzer-Avatar
Darryl Bayliss

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.

    – Chantell Osejo

    15. Dezember 2016 um 21:10 Uhr

  • Wenn Sie Ihre Antwort aktualisieren möchten, lautet der neue Link für Android x developer.android.com/reference/androidx/appcompat/app/…

    – Snikola

    4. Februar 2019 um 7:14 Uhr

Benutzer-Avatar
Saj

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

Benutzer-Avatar
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);

Benutzer-Avatar
kpsfoo

Wie Sie die Aufwärtsnavigation richtig verwenden, erfahren Sie unter diesen Android-Entwicklerleitfaden.

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.

Benutzer-Avatar
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:

  1. 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

  2. (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.

Benutzer-Avatar
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);
}

1227790cookie-checkDynamisch eingestellte Elternaktivität

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy