Android 工具栏后退按钮上的动画

And*_*ohr 4 android android-animation android-toolbar

我有一个活动,它有一个显示后退按钮的工具栏。

<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"
        />
Run Code Online (Sandbox Code Playgroud)

后退按钮是这样启用的:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_about);
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
Run Code Online (Sandbox Code Playgroud)

我从我的主要活动中调用此活动,如下所示:

Intent intent = new Intent(this, AboutActivity.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

Activity 的父级在清单中定义

<activity android:name=".AboutActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".EntryActivity" />
</activity>
Run Code Online (Sandbox Code Playgroud)

到目前为止一切正常,只是在使用工具栏中的后退按钮时过渡动画是错误的。

当我打开活动时,它从右侧滑入。

当我按下手机的物理后退按钮时,它再次向右滑出。这是对的。

但是,当使用工具栏后退按钮时,它会向左滑出。这看起来不对。我该如何更改它,使其复制物理后退按钮的行为?

Ben*_* P. 8

当您按下 Actionbar Up 按钮时,AppCompatActivity在其onMenuItemSelected()调用中检测到此按钮按下,并调用onSupportNavigateUp(). 此方法确定“父活动”Intent并使用它向上导航。因为它使用Intent(重新)打开前一个活动,所以它使用与打开“新”屏幕相同的动画。

假设你不关心“向上导航”模式的特殊细节(听起来你不关心,因为评论让我相信你没有横向导航,你无法进入第二个活动从您的第一个活动以外的任何地方),您可以通过覆盖该onSupportNavigateUp()方法来回避所有这些内置的“向上”行为。

@Override
public boolean onSupportNavigateUp() {
    finish();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这意味着按下 Actionbar Up 按钮总是简单的finish()es 你的活动,所以(就像我之前说的)你失去了所有智能内置的“向上”行为......但无论如何你都不想要。

您也可以在 中处理 Actionbar Up 按钮onOptionsItemSelected(),但我更喜欢另一种方式,因为我认为您正在劫持系统的 up 行为更明显一点。

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

    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

有了这些中的任何一个,您就可以从清单中删除“父”定义,因为现在它们没有被使用。