Android 导航 - 弹出后退堆栈时删除操作栏后退按钮
Android Navigation - Removing Action Bar Back Button When Popping Back Stack
我想做什么
我正在使用 Android 导航组件来处理我应用程序中的导航。在这个例子中,我有两个屏幕,屏幕 A 和屏幕 B。
我希望用户能够单击屏幕 A 中的按钮并能够导航到屏幕 B;然后被阻止返回到上一个屏幕(屏幕 A)。
问题
当用户从屏幕 A 导航到屏幕 B 时,操作栏上的后退按钮仍然允许用户返回到上一个屏幕,但是当点击底部栏中的后退按钮时,它会退出应用程序所以这部分工作正常。
我需要做什么才能删除操作栏中的后退按钮?
我目前阅读的内容
我遵循了这三篇文章中的指导,但我认为它们可能忽略了 ActionBar
的后退按钮:
- Whosebug - 如何在导航到后清除导航堆栈
Android
中的另一个片段
- Android Developer Guide - Conditional navigation
- Android Developer Guide - Navigate to a destination
我的代码
导航图 - nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph"
app:startDestination="@id/screen_a">
<fragment
android:id="@+id/screen_a"
android:name="com.example.conditionalnavigation.AFragment"
android:label="screen A">
<action
android:id="@+id/action_AFragment_to_BFragment"
app:destination="@id/screen_b"
app:launchSingleTop="true"
app:popUpTo="@id/screen_a"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/screen_b"
android:name="com.example.conditionalnavigation.BFragment"
android:label="screen B" />
</navigation>
MainActivity - 这是我的单一 Activity 导航主机。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val navController = this.findNavController(R.id.myNavHostFragment)
NavigationUI.setupActionBarWithNavController(this, navController)
}
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.myNavHostFragment)
return navController.navigateUp()
}
}
在您的 activity class 中添加以下成员(在 Kotlin 中):
private lateinit var appBarConfiguration: AppBarConfiguration
在 onCreate 方法中添加以下行:
....
val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
...
...
appBarConfiguration = AppBarConfiguration(
setOf([**ID of the fragment layout you want without back button**],
), drawerLayout
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
....
这样,您的片段将成为根片段,后退按钮将被移除。希望对你有帮助。
尝试在创建屏幕 b 片段时禁用主页按钮:
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var rootView = inflater?.inflate(R.layout.fragment_screen_b, container, false)
(activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(false)
return rootView
}
如果还是不行,那就用onViewCreated()
方法试试。
如果不行,请尝试在下面添加:
setHasOptionsMenu(false)
我想做什么
我正在使用 Android 导航组件来处理我应用程序中的导航。在这个例子中,我有两个屏幕,屏幕 A 和屏幕 B。 我希望用户能够单击屏幕 A 中的按钮并能够导航到屏幕 B;然后被阻止返回到上一个屏幕(屏幕 A)。
问题
当用户从屏幕 A 导航到屏幕 B 时,操作栏上的后退按钮仍然允许用户返回到上一个屏幕,但是当点击底部栏中的后退按钮时,它会退出应用程序所以这部分工作正常。
我需要做什么才能删除操作栏中的后退按钮?
我目前阅读的内容
我遵循了这三篇文章中的指导,但我认为它们可能忽略了 ActionBar
的后退按钮:
- Whosebug - 如何在导航到后清除导航堆栈 Android 中的另一个片段
- Android Developer Guide - Conditional navigation
- Android Developer Guide - Navigate to a destination
我的代码
导航图 - nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph"
app:startDestination="@id/screen_a">
<fragment
android:id="@+id/screen_a"
android:name="com.example.conditionalnavigation.AFragment"
android:label="screen A">
<action
android:id="@+id/action_AFragment_to_BFragment"
app:destination="@id/screen_b"
app:launchSingleTop="true"
app:popUpTo="@id/screen_a"
app:popUpToInclusive="true" />
</fragment>
<fragment
android:id="@+id/screen_b"
android:name="com.example.conditionalnavigation.BFragment"
android:label="screen B" />
</navigation>
MainActivity - 这是我的单一 Activity 导航主机。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val navController = this.findNavController(R.id.myNavHostFragment)
NavigationUI.setupActionBarWithNavController(this, navController)
}
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.myNavHostFragment)
return navController.navigateUp()
}
}
在您的 activity class 中添加以下成员(在 Kotlin 中):
private lateinit var appBarConfiguration: AppBarConfiguration
在 onCreate 方法中添加以下行:
....
val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
...
...
appBarConfiguration = AppBarConfiguration(
setOf([**ID of the fragment layout you want without back button**],
), drawerLayout
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
....
这样,您的片段将成为根片段,后退按钮将被移除。希望对你有帮助。
尝试在创建屏幕 b 片段时禁用主页按钮:
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
var rootView = inflater?.inflate(R.layout.fragment_screen_b, container, false)
(activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(false)
return rootView
}
如果还是不行,那就用onViewCreated()
方法试试。
如果不行,请尝试在下面添加:
setHasOptionsMenu(false)