从对话框到带有导航组件的片段的堆栈清除。

问题描述 投票:0回答:1

我正在使用导航组件来做导航,但结果很奇怪。当我试着从对话框零碎(Cart)中按回键时。当前的片段堆栈图(Home -> Notification)很清晰,如下图。

navigation-video

当我在购物车页面上按下返回按钮时,我期望的是回到通知页面,而不是主页。

我没有在这些片段中添加任何自定义的后退按钮事件。这看起来很奇怪,但我在官方找不到任何相关文档。

感谢对这个问题的任何评论或建议

这是我的移动导航.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)
    }
}
android android-fragments android-architecture-navigation android-navigation
1个回答
4
投票

如果你仔细观察,你会发现主页是在购物车出现之前显示的。这是因为实现了 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" />
© www.soinside.com 2019 - 2024. All rights reserved.