[英]Stack Clear from dialog to fragment with navigation component
我正在使用导航组件进行导航,但结果很奇怪。 当我试图从对话框片段(购物车)中按下后退按钮时。 当前片段堆栈图(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.setupWithNavController(NavController)
一起使用的BottomNavigationView.OnNavigationItemSelectedListener
的实现。
它只是调用MenuItem.onNavDestinationSelected(NavController)
,当MenuItem
没有辅助标志时,它将返回堆栈弹出到起始目的地。
因此,无论何时您不想清除堆栈,都需要将android:menuCategory="secondary"
添加到菜单项。
<item
android:id="@+id/action_foo_bar"
android:menuCategory="secondary"
android:title="@string/action_foo_bar" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.