[英]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.