在多个片段之间向后导航的简单方法是什么?

时间:2019-06-21 14:31:03

标签: android android-fragments viewmodel

首先,很抱歉,如果这与任何线程重复,我进行了搜索,但没有发现与我的情况真正相似的东西,或者至少没有任何东西可以帮助我解决问题。

基本上,我想知道以一种简单干净的方式调用onBackPressed()方法时在片段之间导航的最佳方法是什么。

我有一个Activity,它调用一个片段(我们称之为ListFrag)。该ListFrag显示了一个项目列表,单击该列表将调用另一个包含该项目详细信息的片段(我们将其称为DetailFrag)。这很简单,并且一切正常:ListFrag调用DetailFrag,按“后退”按钮将仅按预期方式向后导航。好!

但是我的问题是,现在我在ListFrag和DetailFrag之间包括了一个额外的步骤。现在,ListFrag将调用另一个称为PagerFrag的Fragment,这将允许我们通过滑动(使用FragmentStatePagerAdapter)进行分页,一个接一个显示多个DetailFrag。另外,我需要支持两种情况:

案例1 :用户使用智能手机,无论设备的方向如何,导航流程均为ListFrag> PagerFrag> DetailFrag。

案例2 :用户正在使用平板电脑,如果平板电脑处于“纵向”模式,它将作为第一种情况使用,但是如果处于“横向”模式,则它必须忽略PagerFrag(我们将无法通过滑动进行分页),并在同一布局上同时显示ListFrag和DetailFrag。

同样,我做了一些工作,并且在所有情况下都运行良好。主要问题是何时向后导航:按下BackButton成为一场噩梦,因为我对FragmentManager如何堆叠Fragment(或FragmentTransactions,如果我没记错的话)感到完全困惑,因为PagerFrag向其中添加了多个DetailFrag堆栈(Pager中的上一个,当前和下一个)。我必须不断检查onBackPressed()方法中的“ if(fragment is DetailFrag)”,才能告诉应用程序下一步去哪里。

并考虑这种情况:用户正在以纵向模式使用平板电脑。用户导航ListFrag> PagerFrag> DetailFrag。然后,用户更改设备方向。我必须“杀死” Pager和DetailFrag,并用另一个xml布局(一个并排显示2个片段的布局)重新创建ListFrag,然后在其中充气一个DetailFrag。

它正在工作,但是所有这些变通办法都很丑陋,并且确实在某种程度上不遵循最佳实践。这使得代码非常无聊,难以维护/重用。

我使用一个ViewModel来连接Activity和3个片段,并使用LiveData设法在UI中正确显示信息。项目的数据不是问题,只是所有这些片段之间的向后导航。

重新创建“活动”或用户向后导航时,我尝试处理每种特定情况,但是我不喜欢这种方法。

我当前的解决方案是这样的:

override fun onBackPressed() {

        if (supportFragmentManager.backStackEntryCount == 0) {
            super.onBackPressed()
        } else {
            if(supportFragmentManager.fragments.first() is PagerFrag ||
                    (!viewModel.isTwoPane)){
/* isTwoPane indicates if we will have 2 fragments side by side if it's a tablet in landscape mode */
                for(frag in supportFragmentManager.fragments) {
                    if(frag is DetailFrag) {
                        supportFragmentManager
                                .beginTransaction()
                                .remove(frag)
                                .commit()
                    }
                }
            }
            supportFragmentManager.popBackStackImmediate()
        }

    }

在Fragment的onCreatedView()方法中还有几行内容,用于处理重新创建Activity(方向更改)的情况。

因此,我希望找到一种在Fragments之间向后导航的简单方法,而不必检查诸如“用户是否在横向模式下使用平板电脑,并且他正在查看DetailFrag吗? 我宁愿暂时避免使用新的AndroidX导航,因为我正在处理一个(有点)复杂的项目。

感谢您的时间,如果需要提供更多信息/上下文,请告诉我!

1 个答案:

答案 0 :(得分:0)

在对Back Stack和onBackPressed()方法中的所有实例检查进行了更多努力之后,我决定再次尝试AndroidX Navigation Architecture,就像注释中建议的JDevoloper一样,并且事实证明,它工作得很好。这确实是一个很好的解决方案。在更改设备方向时,ViewPager和处理导航方面仍然存在一些问题,但是现在一切都已解决,并且可以按预期工作。谢谢您的帮助!