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

0md85ypi  于 2023-05-12  发布在  Android
关注(0)|答案(3)|浏览(135)

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

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

到目前为止一切正常,除了使用工具栏中的后退按钮时过渡动画是错误的。
当我打开活动时,它从右侧滑入。
当我按下手机的物理后退按钮时,它又滑向右侧。这是正确的。
但是,当使用工具栏后退按钮时,它会向左滑出。这看起来不对。我怎样才能改变这一点,使它复制物理后退按钮的行为?

nr9pn0ug

nr9pn0ug1#

当您按下Actionbar Up按钮时,AppCompatActivity在其onMenuItemSelected()调用中检测到此按钮按下,并调用onSupportNavigateUp()。此方法确定“父活动”Intent并使用它向上导航。因为它使用Intent来(重新)打开前一个Activity,所以它使用与打开“新”屏幕相同的动画。
假设您不关心“向上导航”模式的特殊细节(听起来您并不关心,因为评论让我相信您没有横向导航,并且您无法从第一个活动以外的任何地方到达第二个活动),您可以通过重写onSupportNavigateUp()方法来避开所有这些内置的“向上”行为。

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

这将意味着按下操作栏向上按钮总是简单地finish() es你的活动,所以(就像我之前说的)你失去了所有智能内置的“向上”行为…但你也不想那样
您也可以在onOptionsItemSelected()中处理Actionbar Up按钮,但我更喜欢另一种方式,因为我认为这样更明显地劫持了系统的向上行为。

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

    return super.onOptionsItemSelected(item);
}

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

k2arahey

k2arahey2#

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

c2e8gylq

c2e8gylq3#

这是因为默认的launchMode活动是standard
standard的文档说明如下:
系统总是在目标任务中创建Activity的新示例,并将Intent路由到它。
您可以通过在父/起始Activity上使用android:launchMode="singleTop"来解决这个问题。
如果Activity的示例已经存在于目标任务的顶部,则系统通过调用其onNewIntent()方法将Intent路由到该示例,而不是创建Activity的新示例。
有关更多信息,请参阅Tasks and the back stack和android:launchMode。

相关问题