首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >处理片段反向导航和底部导航视图所选项目

处理片段反向导航和底部导航视图所选项目
EN

Stack Overflow用户
提问于 2019-06-12 02:59:34
回答 2查看 337关注 0票数 0

我已经实现了一个bottomNavigationView,其中每个选项都有自己的条目片段,有些选项在同一选项下有更多的导航。

不知何故,就像这样:

A->A1

B->B1

C->C1->C2

D->D1

E->E1->E2

其中,A、B、C、D和E是底部导航视图的选项(MenuItem),A1、B1、C1、D1、E1分别是这些选项的条目片段

所需的导航是应用程序的入口和出口点将始终是选项A(入口片段A1)。因此,如果用户导航到另一个选项,只要是在该选项的条目片段中,则任何向后导航的行为都应该是转到选项A。

我遇到的问题是bottomNavigationView总是作为一个需求出现,所以用户可以在任何时候导航到任何选项。

例如,如果用户导航到选项E,那么在E1中执行一个操作,导航到E2,然后导航到选项B,如果用户按下back按钮,则应用程序应该转到选项A,因为它在条目片段B1中。此外,如果用户使用底部导航视图导航到选项A,然后按下后退按钮,因为我们在出口点,我们应该完成应用程序。

在OnNavigationItemSelectedListener中,我使用除选项A之外的任何选项的beginTransaction.replace替换所选选项的条目片段的当前片段。我添加了addToBackStack(null),但这并不匹配所需的导航,因为如果用户按下后退按钮,例如导航到选项A,它将导航到前一个所选选项。在使用popBackStack(BACK_STACK_HOME_TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE)替换片段并替换添加addToBackStack(BACK_STACK_HOME_TAG)之前,A也曾尝试弹出后台包,但不知何故,当选择第二个选项时,它显示的不是所选选项的条目片段,而是片段A1

代码语言:javascript
复制
navBar.setOnNavigationItemReselectedListener {
    when(it.itemId) {
        R.id.optionA -> {

            // Removes all entries in the backstack if any
            if (supportFragmentManager.backStackEntryCount > 0) {
                supportFragmentManager.popBackStack(
                    null,FragmentManager.POP_BACK_STACK_INCLUSIVE
                )

                return@setOnNavigationItemSelectedListener true
            }

            // Replaces/add the entry fragment
            supportFragmentManager.beginTransaction()
                    .replace(R.id.fragmentHost, FragmentA1())
                    .commit()
            return@setOnNavigationItemSelectedListener true
        }

        R.id.optionB -> {
            // Removes all entries in the backstack up to BACK_STACK_HOME_TAG
            supportFragmentManager.popBackStack(
                BACK_STACK_HOME_TAG,
                FragmentManager.POP_BACK_STACK_INCLUSIVE
            )

            // Replace the fragment with the entry FragmentB1
            supportFragmentManager.beginTransaction()
                    .replace(R.id.fragmentHost, FragmentB1())
                    .addToBackStack(BACK_STACK_HOME_TAG)
                    .commit()

            return@setOnNavigationItemSelectedListener true
        }

        R.id.optionC -> {
            // Removes all entries in the backstack up to BACK_STACK_HOME_TAG
            supportFragmentManager.popBackStack(
                BACK_STACK_HOME_TAG,
                FragmentManager.POP_BACK_STACK_INCLUSIVE
            )

            // Replace the fragment with the entry FragmentC1
            supportFragmentManager.beginTransaction()
                    .replace(R.id.fragmentHost, FragmentC1())
                    .addToBackStack(BACK_STACK_HOME_TAG)
                    .commit()

            return@setOnNavigationItemSelectedListener true
        }

        ...

        return@setOnNavigationItemSelectedListener false
    }
}



override fun onBackPressed() {
    if (supportFragmentManager.backStackEntryCount > 0) {
        supportFragmentManager.popBackStack()
        return
    }

    super.onBackPressed()
}
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56550194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档