2017-11-01 3 views
0

Ich habe eine Aktivität, die eine Symbolleiste hat, die eine Schaltfläche zurück anzeigt.Animation auf Android Toolbar Zurück Button

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_about); 
setSupportActionBar(toolbar); 
//noinspection ConstantConditions 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setDisplayShowHomeEnabled(true); 

Ich nenne diese Aktivität von meiner Haupttätigkeit wie folgt aus::

Intent intent = new Intent(this, AboutActivity.class); 
startActivity(intent); 

Die Eltern im Manifest

definiert Aktivitäten

<android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar_about" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     android:minHeight="?attr/actionBarSize" 
     android:theme="?attr/actionBarTheme" 
     app:title="@string/app_name" 
     /> 

Die Zurück-Taste wie folgt aktiviert

<activity android:name=".AboutActivity"> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value=".EntryActivity" /> 
</activity> 

So Bisher funktioniert alles einwandfrei, außer dass die Übergangsanimation falsch ist, wenn Sie die Zurück-Schaltfläche in der Symbolleiste verwenden.

Wenn ich die Aktivität öffne, wird sie von rechts eingezogen.

Wenn ich die physische Zurück-Taste des Telefons drücke, wird sie wieder nach rechts geschoben. Das ist richtig.

Wenn Sie jedoch die Schaltfläche Zurück auf der Symbolleiste verwenden, wird sie nach links verschoben. Das sieht falsch aus. Wie kann ich das ändern, also dupliziert es das Verhalten der physischen Zurück-Schaltfläche?

+0

Müssen Sie die übergeordnete Aktivität im Manifest definieren? Damit meinen Sie, unterstützen Sie laterale vs hierarchische Navigation oder können Sie "AboutActivity" von einem anderen Ort als "EntryActivity" öffnen? –

+0

Nun, wenn ich die Eltern nicht definieren, tut der Button gar nichts. Ich habe nur diese beiden Aktivitäten, also kann ja die Aktivität nur von der anderen aus aufgerufen werden. –

Antwort

3

Wenn Sie die Aktionsbalken-Taste drücken, erkennt AppCompatActivity diese Schaltfläche in ihrem onMenuItemSelected() Aufruf und ruft onSupportNavigateUp() auf. Diese Methode ermittelt die "übergeordnete Aktivität" Intent und verwendet diese, um nach oben zu navigieren. Da es eine Intent verwendet, um die vorherige Aktivität (wieder) zu öffnen, verwendet es die gleiche Animation, die es für das Öffnen eines "neuen" Bildschirms verwenden würde.

Angenommen, Sie kümmern sich nicht um die besonderen Feinheiten des "Up Navigation" -Musters (das klingt wie Sie nicht, wie Kommentare haben mich zu glauben, dass Sie keine seitliche Navigation haben und Sie nicht bekommen können zu Ihrer zweiten Aktivität von einem anderen Ort als Ihrer ersten Aktivität aus), können Sie das gesamte integrierte "Up" -Verhalten umgehen, indem Sie die Methode onSupportNavigateUp() überschreiben.

@Override 
public boolean onSupportNavigateUp() { 
    finish(); 
    return true; 
} 

Dies bedeutet, dass die ActionBar Up-Taste immer einfach finish() És Ihre Aktivität, so (wie ich schon sagte) Sie das alles verlieren auf intelligente integrierte „up“ Verhalten ... aber Sie didn Ich will das sowieso nicht.

Sie könnten auch die Actionbar Up-Taste in onOptionsItemSelected() handhaben, aber ich bevorzuge den anderen Weg, da ich denke, dass es ein wenig offensichtlicher ist, dass Sie das System Up-Verhalten hijacking.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == android.R.id.home) { 
     finish(); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

mit einem dieser vorhanden ist, können Sie die „Eltern“ Definitionen von Ihrem Manifest, entfernen, da jetzt sind sie nicht verwendet wird.

+0

Vielen Dank für die ausführliche Antwort. Es kam mir nicht in den Sinn, dass onOptionsSetelected() sogar verwandt wäre, aber es macht, da die Symbolleiste auch das Menü behandeln soll. Aber du hast Recht, die onSupportNavigateUp() Überschreibung ist völlig ausreichend für meinen Anwendungsfall. Danke noch einmal. –