it-swarm.com.de

Wie kann ich zu einer übergeordneten Aktivität zurückkehren?

Ich habe 2 Aktivitäten (A und B) in meiner Android=) - Anwendung und ich verwende eine Absicht, um 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 eine UP-Taste bietet.

Nachdem ich die 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 der Aktivität A erneut aufzurufen scheint und dies nicht das Verhalten, das ich brauche. Ich brauche Aktivität A, um so auszusehen, wie es ausgesehen hat, bevor ich Aktivität B aufgerufen habe.

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 von Eclipse automatisch generiert.

Klasse B sieht so aus:

    @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);
}
172
ashiaka

Sie haben die Aktivität A mit dem Standard launchMode im Android= Manifest deklariert. Gemäß der Dokumentation bedeutet dies Folgendes:

Das System erstellt immer eine neue Instanz der Aktivität in der Zielaufgabe und leitet die Absicht an diese weiter.

Daher ist das System gezwungen, die Aktivität A erneut zu erstellen (d. H. onCreate aufzurufen), selbst wenn der Aufgabenstapel korrekt behandelt wird.

Um dieses Problem zu beheben, müssen Sie das Manifest ändern und der Aktivitätsdeklaration A das folgende Attribut hinzufügen:

Android:launchMode="singleTop"

Hinweis: Das Aufrufen von finish() (wie zuvor als Lösung vorgeschlagen) funktioniert nur , wenn Sie = sind ganz sicher 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 aus einer Benachrichtigung) ist dies möglicherweise nicht der Fall und Sie müssen die Aktivität A korrekt von B aus starten.

326
LorenzCK

Aktualisierte Antwort: Up Navigation Design

Sie müssen für jede Aktivität angeben, welche 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,

<!-- The main/home activity (it has no parent activity) -->
    <activity
        Android:name="com.example.app_name.A" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        Android:name=".B"
        Android:label="B"
        Android:parentActivityName="com.example.app_name.A" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="com.example.app_name.A" />
    </activity>

Wenn die übergeordnete Aktivität auf diese Weise deklariert wurde, können Sie wie folgt zum entsprechenden übergeordneten Element navigieren:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case Android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Wenn Sie diese Methode NavUtils.navigateUpFromSameTask(this); 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 FLAG_ACTIVITY_CLEAR_TOP Definiert vorgezogen.

Und um die Up-Taste anzuzeigen, müssen Sie setDisplayHomeAsUpEnabled(): deklarieren

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

Alte Antwort: (Ohne Aufwärtsnavigation, Standard-Rückwärtsnavigation)

Dies geschieht nur, wenn Sie die Aktivität A erneut von der Aktivität B aus starten.

Mit startActivity().

Stattdessen aus Aktivität A starten Sie Aktivität B mit startActivityForResult() und überschreiben onActivtyResult() in Aktivität A.

Rufen Sie jetzt in Aktivität B einfach finish() auf der Schaltfläche Nach oben auf. Sie haben also jetzt zu Aktivität A's onActivityResult() weitergeleitet, ohne erneut Aktivität A zu erstellen.

80
user370305

Ich hatte so ziemlich das gleiche Setup, was zu dem gleichen unerwünschten Verhalten führte. Für mich hat das funktioniert: Hinzufügen des folgenden Attributs zu einer Aktivität A in der Manifest.xml meiner App:

Android:launchMode="singleTask"

Siehe dieser Artikel für weitere Erklärungen.

22
androidnewbie

Obwohl eine alte Frage, hier ist eine andere (imho die sauberste und beste) Lösung, da alle vorherigen Antworten für mich nicht funktionierten, da ich Aktivität B entkoppelt habe aus einem Widget .

public void navigateUp() {
final Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
    Log.v(logTag, "Recreate back stack");
        TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
  } else {
    NavUtils.navigateUpTo(this, upIntent);
  }
}

[ https://stackoverflow.com/a/31350642/570168 ]

Siehe auch: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-Android

19
Tobias

Ein besserer Weg, dies zu erreichen, besteht darin, zwei Dinge zu verwenden: call:

NavUtils.navigateUpFromSameTask(this);

Damit dies funktioniert, muss Ihre Manifestdatei den Status haben, dass Aktivität A eine übergeordnete Aktivität B hat. Die übergeordnete Aktivität benötigt nichts. Ab Version 4 erhalten Sie ohne zusätzlichen Aufwand einen Nizza-Zurück-Pfeil (dies kann auch in niedrigeren Versionen mit ein wenig Code durchgeführt werden, ich werde es unten einfügen). Sie können diese Daten in der Registerkarte Manifest-> Anwendung festlegen in der GUI (scrollen Sie nach unten zum übergeordneten Aktivitätsnamen und geben Sie ihn von Hand ein)

Stützknoten:

wenn Sie eine Version unter Version 4 unterstützen möchten, müssen Sie auch Metadaten einbeziehen. Klicken Sie mit der rechten Maustaste auf die Aktivität, add-> meta data, name = Android.support.PARENT_ACTIVITY und value = your.full.activity.name

um den Nizza-Pfeil auch in niedrigeren Versionen zu bekommen:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

bitte beachten Sie, dass Sie die Unterstützungsbibliothek Version 7 benötigen, um dies alles zum Laufen zu bringen, aber es lohnt sich!

7
donald

Was für mich funktioniert hat, war das Hinzufügen:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case Android.R.id.home:
                onBackPressed();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onBackPressed() {
        finish();
    }

auf TheRelevantActivity.Java und jetzt funktioniert es wie erwartet

und ja, vergiss nicht hinzuzufügen:

getSupportActionbar.setDisplayHomeAsUpEnabled(true); in onCreate() Methode

5
Hammad Nasir

Zur Antwort von @ LorenCK hinzufügen, ändern

NavUtils.navigateUpFromSameTask(this);

weiter unten finden Sie den Code, wenn Ihre Aktivität von einer anderen Aktivität aus gestartet werden kann und dies Teil einer Aufgabe sein kann, die von einer anderen App gestartet wurde

Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    TaskStackBuilder.create(this)
            .addNextIntentWithParentStack(upIntent)
            .startActivities();
} else {
    NavUtils.navigateUpTo(this, upIntent);
}

Dies startet eine neue Aufgabe und die übergeordnete Aktivität Ihrer Aktivität, die Sie in Manifest wie unten in Min SDK Version <= 15 definieren können

<meta-data
        Android:name="Android.support.PARENT_ACTIVITY"
        Android:value="com.example.app_name.A" />

Oder mit parentActivityName, wenn es> 15 ist

4
Sourabh

Ich habe es versucht Android:launchMode="singleTask", aber es hat nicht geholfen. Arbeitete für mich mit Android:launchMode="singleInstance"

4
Pnemonic

Ich hatte ein ähnliches Problem bei der Verwendung von Android 5.0 mit einem falschen übergeordneten Aktivitätsnamen

<activity
        Android:name=".DisplayMessageActivity"
        Android:label="@string/title_activity_display_message"
        Android:parentActivityName=".MainActivity" >
        <meta-data
            Android:name="Android.support.PARENT_ACTIVITY"
            Android:value="com.example.myfirstapp.MainActivity" />
    </activity>

Ich habe com.example.myfirstapp aus dem übergeordneten Aktivitätsnamen entfernt und es hat ordnungsgemäß funktioniert

3

In Java class: -

    toolbar = (Toolbar) findViewById(R.id.apptool_bar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setTitle("Snapdeal");

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Im Manifest: -

<activity
            Android:name=".SubActivity"
            Android:label="@string/title_activity_sub"
            Android:theme="@style/AppTheme" >
            <meta-data Android:name="Android.support.PARENT_ACTIVITY" Android:value=".MainActivity"></meta-data>
    </activity>

Es wird dir helfen

Fügen Sie Ihrer Aktivitätsliste Informationen mit Attribut hinzu

Android:launchMode="singleTask"

funktioniert gut für mich

2
Pravesh Kumar

versuche dies:

Intent intent;
@Override
public void onCreate(Bundle savedInstanceState) {
intent = getIntent();   
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.navigateUpTo(this,intent);
        return true;
}
return super.onOptionsItemSelected(item);
}
1
Luis Valadez
    @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);

wie ein Zurück drücken

1
Dan Alboteanu

In mein Manifest zu gehen und der Aktivität Android:launchMode="singleTop" Hinzuzufügen, hat den Trick für mich getan.

Dies löste speziell mein Problem, da ich nicht wollte, dass Android nach dem Klicken auf die Schaltfläche Up in der Symbolleiste eine neue Instanz der vorherigen Aktivität erstellt - ich wollte stattdessen die verwenden Bestehende Instanz der vorherigen Aktivität, als ich die Navigationshierarchie nach oben ging.

Referenz: Android: launchMode

0
mumush

Versuchen Sie diese Lösung mit NavUtils.navigateUpFromSameTask (this); in der untergeordneten Aktivität: https://stackoverflow.com/a/49980835/7308789

0
Houssin Boulla