Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Animation on Android Toolbar Back Button

I have an activity wich has a Toolbar which displays a back button.

<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"
        />

The back button is enabled like this:

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

I call this activity from my main activity like this:

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

The Activity's parent is defined in the manifest

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

So far everything works fine, except that the transition animation is wrong when using the back button in the Toolbar.

When I open the activity, it slides in from the right.

When I press the phone's physical back button it slides out to the right again. This is correct.

However when using the Toolbar back button it slides out to the left. This looks wrong. How can I change this, so it duplicates the behaviour of the physical back button?

like image 583
Andreas Gohr Avatar asked Jan 04 '23 06:01

Andreas Gohr


1 Answers

When you press the Actionbar Up button, AppCompatActivity detects this button press in its onMenuItemSelected() call, and invokes onSupportNavigateUp(). This method determines the "parent activity" Intent and uses that to navigate up. Because it's using an Intent to (re-)open the previous activity, it uses the same animation it would for opening a "new" screen.

Assuming you don't care about the particular niceties of the "Up Navigation" pattern (which it sounds like you do not, as comments have led me to believe you don't have lateral navigation and you can't get to your second activity from anywhere other than your first activity), you can side-step all of this built-in "up" behavior by overriding the onSupportNavigateUp() method.

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

This will mean that pressing the Actionbar Up button always simply finish()es your activity, so (like I said before) you lose out on all the smart built-in "up" behavior... but you didn't want that anyway.

You could also handle the Actionbar Up button in onOptionsItemSelected(), but I prefer the other way since I think it's a little more obvious that you're hijacking the system's up behavior.

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

    return super.onOptionsItemSelected(item);
}

With either of these in place, you can remove the "parent" definitions from your manifest, since now they're not used.

like image 154
Ben P. Avatar answered Jan 20 '23 18:01

Ben P.