为什么工具栏中的 onBackPressed() 没有反应?
How come the onBackPressed() in a toolbar doesn't react?
我正在尝试在我的工具栏中执行 onBackPressed() 以返回到 MainActivity。
我在另一个项目中使用了它并且没有失败。
在这个项目中,后退箭头没有反应。
MainActivity 是另一个 activity(清单)的父级。
编辑:通过覆盖 onBackPressed 函数,后退箭头在多次点击后做出反应..
非常感谢
if (happyPlaceDetailModel != null) {
setSupportActionBar(binding.toolbarHappyPlaceDetail)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.title = happyPlaceDetailModel.title
binding.toolbarHappyPlaceDetail.setNavigationOnClickListener {
onBackPressed()
}
布局文件:
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.HappyPlaceDetailActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_happy_place_detail"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:theme="@style/CustomToolbarStyle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
清单:
<application
android:allowBackup="true"
android:icon="@drawable/happy_place_background"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HappyPlaces">
<activity android:name=".activities.HappyPlaceDetailActivity"
android:parentActivityName=".activities.MainActivity"
android:theme="@style/CustomNoActionBarTheme"
android:label="Happy Place details"/>
<activity
android:name=".activities.AddHappyPlaceActivity"
android:label="Add a Happy Place"
android:theme="@style/CustomNoActionBarTheme" />
<activity android:name=".activities.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
你试过用这个吗?
override fun onSupportNavigateUp(): Boolean {
onBackPressed()
return true
}
我不建议你用“!!”,用“.?”会更好。因为它可以给你一个 NullPointerException。
抱歉迟来的回答。
当您像这样设置工具栏时:
override fun onCreate(savedInstanceState: Bundle?) {
setSupportActionBar(tb_chat_profile)
supportActionBar?.apply {
setHomeButtonEnabled(true)
setDisplayHomeAsUpEnabled(true)
}
}
您需要处理 Activity 菜单挂钩上的点击事件:
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when(item.itemId) {
android.R.id.home -> {super.onBackPressed(); true }
else -> super.onOptionsItemSelected(item)
}
这种方法是一种遗留方法,请不要误会我的意思,它有效而且仍然是正确的!
但是现在应用程序所做的现代事情是在布局 xml 文件的工具栏内手动添加一个按钮,如下所示:
<!-- This is pseudo-code, pasting it is likely to not work and it's just for demo purposes -->
<!-- You can play with the location of the button with the toolbar's 'gravity' property -->
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar">
<ImageButton android:id="@+id/back"/>
</androidx.appcompat.widget.Toolbar>
最后设置一个侦听器,就像在任何其他情况下一样:
override fun onCreate(savedInstanceState: Bundle?) {
binding.back.setOnClickListener {
/*assuming you're inside an activity*/
finish()
}
}
我正在尝试在我的工具栏中执行 onBackPressed() 以返回到 MainActivity。
我在另一个项目中使用了它并且没有失败。 在这个项目中,后退箭头没有反应。
MainActivity 是另一个 activity(清单)的父级。
编辑:通过覆盖 onBackPressed 函数,后退箭头在多次点击后做出反应..
非常感谢
if (happyPlaceDetailModel != null) {
setSupportActionBar(binding.toolbarHappyPlaceDetail)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.title = happyPlaceDetailModel.title
binding.toolbarHappyPlaceDetail.setNavigationOnClickListener {
onBackPressed()
}
布局文件:
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.HappyPlaceDetailActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar_happy_place_detail"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:theme="@style/CustomToolbarStyle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
清单:
<application
android:allowBackup="true"
android:icon="@drawable/happy_place_background"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.HappyPlaces">
<activity android:name=".activities.HappyPlaceDetailActivity"
android:parentActivityName=".activities.MainActivity"
android:theme="@style/CustomNoActionBarTheme"
android:label="Happy Place details"/>
<activity
android:name=".activities.AddHappyPlaceActivity"
android:label="Add a Happy Place"
android:theme="@style/CustomNoActionBarTheme" />
<activity android:name=".activities.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
你试过用这个吗?
override fun onSupportNavigateUp(): Boolean {
onBackPressed()
return true
}
我不建议你用“!!”,用“.?”会更好。因为它可以给你一个 NullPointerException。
抱歉迟来的回答。
当您像这样设置工具栏时:
override fun onCreate(savedInstanceState: Bundle?) {
setSupportActionBar(tb_chat_profile)
supportActionBar?.apply {
setHomeButtonEnabled(true)
setDisplayHomeAsUpEnabled(true)
}
}
您需要处理 Activity 菜单挂钩上的点击事件:
override fun onOptionsItemSelected(item: MenuItem): Boolean =
when(item.itemId) {
android.R.id.home -> {super.onBackPressed(); true }
else -> super.onOptionsItemSelected(item)
}
这种方法是一种遗留方法,请不要误会我的意思,它有效而且仍然是正确的!
但是现在应用程序所做的现代事情是在布局 xml 文件的工具栏内手动添加一个按钮,如下所示:
<!-- This is pseudo-code, pasting it is likely to not work and it's just for demo purposes -->
<!-- You can play with the location of the button with the toolbar's 'gravity' property -->
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar">
<ImageButton android:id="@+id/back"/>
</androidx.appcompat.widget.Toolbar>
最后设置一个侦听器,就像在任何其他情况下一样:
override fun onCreate(savedInstanceState: Bundle?) {
binding.back.setOnClickListener {
/*assuming you're inside an activity*/
finish()
}
}