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

时间:2017-11-01 20:23:09

标签: 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"
        />

后退按钮启用如下:

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

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

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

活动的父级在清单中定义

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

到目前为止一切正常,但使用工具栏中的后退按钮时转换动画错误。

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

当我按下手机的物理后退按钮时,它会再次向右滑动。这是正确的。

然而,当使用工具栏后退按钮时,它会向左滑动。这看起来不错。我该怎么改变它,所以它复制了物理后退按钮的行为?

2 个答案:

答案 0 :(得分:4)

当您按下操作栏按钮时,AppCompatActivity会在onMenuItemSelected()来电中按此按钮检测此按钮,并调用onSupportNavigateUp()。这种方法决定了父母的活动&#34; Intent并使用它向上导航。因为它使用Intent来(重新)打开上一个活动,所以它使用与打开&#34; new&#34;相同的动画。屏幕。

假设你并不关心&#34;向上导航&#34;的特殊细节。模式(这听起来像你没有,因为评论让我相信你没有横向导航,你不能从第一次活动以外的任何地方进入你的第二次活动),你可以支持 - 所有这些内置的&#34; up&#34;通过覆盖onSupportNavigateUp()方法的行为。

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

这意味着按下动作栏向上按钮始终只是finish()你的活动,所以(就像我之前说过的那样)你会失去所有智能内置&#34; up&#34;行为......但你还是不想要那样。

你也可以在onOptionsItemSelected()中处理动作栏向上按钮,但我更喜欢另一种方式,因为我认为你劫持系统的行为更加明显

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

    return super.onOptionsItemSelected(item);
}

使用其中任何一个,您可以删除&#34;父母&#34;您的清单中的定义,因为现在它们没有被使用。

答案 1 :(得分:0)

尝试一下:

override fun onSupportNavigateUp(): Boolean { onBackPressed() return true }