我正在使用导航组件来做导航,但结果很奇怪。当我试着从对话框零碎(Cart)中按回键时。当前的片段堆栈图(Home -> Notification)很清晰,如下图。
当我在购物车页面上按下返回按钮时,我期望的是回到通知页面,而不是主页。
我没有在这些片段中添加任何自定义的后退按钮事件。这看起来很奇怪,但我在官方找不到任何相关文档。
感谢对这个问题的任何评论或建议
这是我的移动导航.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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
app:startDestination="@id/navigation_explore">
<fragment
android:id="@+id/navigation_explore"
android:name="com.cn29.hkbvmall.ui.home.HomeFragment"
tools:layout="@layout/fragment_explore" >
<action
android:id="@+id/action_navigation_explore_self"
app:destination="@id/navigation_explore"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popExitAnim="@anim/slide_out_right" />
<argument
android:name="activeCategoryId"
app:argType="integer"
android:defaultValue="0" />
</fragment>
<fragment
android:id="@+id/navigation_notifications"
android:name="com.cn29.hkbvmall.ui.notifications.NotificationsFragment"
tools:layout="@layout/fragment_notifications" />
<dialog
android:id="@+id/navigation_mylist"
android:name="com.cn29.hkbvmall.ui.mylist.MyListFragment"
tools:layout="@layout/fragment_mylist" />
<dialog
android:id="@+id/navigation_cart"
android:name="com.cn29.hkbvmall.ui.shoppingkart.GoodsListDialogFragment"
android:label="GoodsListDialogFragment"
tools:layout="@layout/fragment_shoppingkart"
/>
<dialog
app:moduleName="account"
android:id="@+id/navigation_account"
android:name="com.cn29.account.ui.AccountListDialogFragment"
tools:layout="@layout/dynamic_feature_install_fragment"
/>
</navigation>
这是我的MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var toolbar: Toolbar
private lateinit var appBarConfiguration: AppBarConfiguration
private val navController: NavController by lazy {
findNavController(R.id.nav_host_fragment)
}
private val listener =
NavController.OnDestinationChangedListener { controller, destination, arguments ->
model.triggerDestination(destinationId = destination.id)
}
private val model: MainActivityViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
toolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_explore
)
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
model.notificationPageSelect.observe(this, EventObserver {
when (it) {
R.id.navigation_explore -> updateAppBarBg(R.drawable.explore_appbar_bg_gradient)
R.id.navigation_notifications -> updateAppBarBg(R.drawable.notification_appbar_bg_gradient)
}
})
}
private fun updateAppBarBg(appBg: Int) {
toolbar.setBackgroundResource(appBg)
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.overflow_menu, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp(appBarConfiguration)
}
override fun onResume() {
super.onResume()
navController.addOnDestinationChangedListener(listener)
}
override fun onPause() {
super.onPause()
navController.removeOnDestinationChangedListener(listener)
}
}
如果你仔细观察,你会发现主页是在购物车出现之前显示的。这是因为实现了 BottomNavigationView.OnNavigationItemSelectedListener
搭配 BottomNavigationView.setupWithNavController(NavController)
.
这只是打电话 MenuItem.onNavDestinationSelected(NavController)
的时候,它将后栈弹出到起始目的地。MenuItem
是没有二级标志的。
所以只要你不想让堆栈被清空,你就需要添加 android:menuCategory="secondary"
到您的菜单项目。
<item
android:id="@+id/action_foo_bar"
android:menuCategory="secondary"
android:title="@string/action_foo_bar" />