首先,很抱歉,如果这与任何线程重复,我进行了搜索,但没有发现与我的情况真正相似的东西,或者至少没有任何东西可以帮助我解决问题。
基本上,我想知道以一种简单干净的方式调用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来连接活动和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导航,因为我正在处理一个(有点)复杂的项目。
谢谢您的宝贵时间,如果需要提供更多信息/上下文,请告诉我!
最佳答案
在对Back Stack和onBackPressed()方法中的所有实例检查进行了更多努力之后,我决定再次尝试使用AndroidX Navigation Architecture,如注释中建议的JDevoloper,结果证明它可以正常工作。这确实是一个很好的解决方案。在更改设备方向时,ViewPager和处理导航方面仍然存在一些问题,但是现在一切都已解决,并且可以按预期工作。感谢您的帮助!