我有一个活动,其中有一个工具栏,显示一个后退按钮。
<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条答案
按热度按时间nr9pn0ug1#
当您按下Actionbar Up按钮时,
AppCompatActivity
在其onMenuItemSelected()
调用中检测到此按钮按下,并调用onSupportNavigateUp()
。此方法确定“父活动”Intent
并使用它向上导航。因为它使用Intent
来(重新)打开前一个Activity,所以它使用与打开“新”屏幕相同的动画。假设您不关心“向上导航”模式的特殊细节(听起来您并不关心,因为评论让我相信您没有横向导航,并且您无法从第一个活动以外的任何地方到达第二个活动),您可以通过重写
onSupportNavigateUp()
方法来避开所有这些内置的“向上”行为。这将意味着按下操作栏向上按钮总是简单地
finish()
es你的活动,所以(就像我之前说的)你失去了所有智能内置的“向上”行为…但你也不想那样您也可以在
onOptionsItemSelected()
中处理Actionbar Up按钮,但我更喜欢另一种方式,因为我认为这样更明显地劫持了系统的向上行为。有了这两个定义中的任何一个,您就可以从清单中删除“父”定义,因为现在它们没有被使用。
k2arahey2#
试试这个:
override fun onSupportNavigateUp(): Boolean { onBackPressed() return true }
c2e8gylq3#
这是因为默认的
launchMode
活动是standard
。standard
的文档说明如下:系统总是在目标任务中创建Activity的新示例,并将Intent路由到它。
您可以通过在父/起始Activity上使用
android:launchMode="singleTop"
来解决这个问题。如果Activity的示例已经存在于目标任务的顶部,则系统通过调用其onNewIntent()方法将Intent路由到该示例,而不是创建Activity的新示例。
有关更多信息,请参阅Tasks and the back stack和android:launchMode。