簡體   English   中英

堆棧從對話框清除到帶有導航組件的片段

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM