代码之家  ›  专栏  ›  技术社区  ›  Andreas Gohr

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

  •  5
  • Andreas Gohr  · 技术社区  · 7 年前

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

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

    到目前为止,一切正常,除了使用工具栏中的“后退”按钮时过渡动画出错。

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

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

    但是,当使用工具栏上的“后退”按钮时,它会滑到左侧。这看起来不对。我该如何改变这一点,使其复制物理后退按钮的行为?

    3 回复  |  直到 7 年前
        1
  •  10
  •   Ben P.    7 年前

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

    假设你不在乎“向上导航”模式的细节(听起来你不在乎,因为评论让我相信你没有横向导航,除了第一个活动之外,你无法从任何地方进入第二个活动),你可以通过覆盖 onSupportNavigateUp() 方法

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

    finish() 这是你的活动,所以(就像我之前说的)你失去了所有智能内置的“上升”行为。。。但你无论如何都不想那样。

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

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

        2
  •  0
  •   Viktoria    5 年前

    试试这个:

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

        3
  •  0
  •   ElegyD    2 年前

    这是因为默认值 launchMode 活动的数量为 standard
    标准 声明如下:

    系统始终在目标任务中创建活动的新实例,并将意图路由到该实例。

    你可以通过使用 android:launchMode="singleTop" 在父/起始活动上。

    如果目标任务顶部已经存在活动实例,则系统通过调用其onNewIntent()方法将意图路由到该实例,而不是创建活动的新实例。

    有关更多信息,请参阅 Tasks and the back stack android:launchMode .