【发布时间】:2019-06-21 14:31:03
【问题描述】:
首先,如果这与任何线程重复,我很抱歉,我已经搜索过,但没有发现与我的情况真正相似的东西,或者至少没有任何东西可以帮助我解决我的问题。
基本上我想知道在以简单干净的方式调用 onBackPressed() 方法时,在片段之间导航的最佳方式是什么。
我有一个调用片段的 Activity(我们称之为 ListFrag)。这个 ListFrag 显示了一个项目列表,当单击这些项目时,将调用另一个包含该项目详细信息的片段(我们称之为 DetailFrag)。这很简单,一切正常:ListFrag 调用 DetailFrag,按下后退按钮将按预期向后导航。好!
但我的问题是现在我在 ListFrag 和 DetailFrag 之间添加了一个额外的步骤。现在,ListFrag 将调用另一个名为 PagerFrag 的 Fragment,这将允许我们通过滑动(使用 FragmentStatePagerAdapter)进行分页,一个接一个地显示多个 DetailFrag。另外,我需要支持两种情况:
案例 1:用户使用智能手机,无论设备的方向如何,导航流程都是 ListFrag > PagerFrag > DetailFrag。
案例 2:用户正在使用平板电脑,如果它处于纵向模式,它将作为第一个案例工作,但如果它处于横向模式,则必须忽略 PagerFrag(我们将无法通过滑动进行分页)并在同一布局上同时显示 ListFrag 和 DetailFrag。
我又做了一些工作,它在所有情况下都运行良好。主要问题是当导航 BACKWARDS 时:按下 BackButton 成为一场噩梦,因为我对 FragmentManager 如何堆叠 Fragment(或 FragmentTransactions,如果我没记错的话)完全感到困惑,因为 PagerFrag 添加了多个 DetailFrag堆栈(寻呼机中的前一个、当前和下一个)。我必须不断检查 onBackPressed() 方法中的“if(fragment is DetailFrag)”,以便能够告诉应用下一步该去哪里。
想想这种情况:用户在纵向模式下使用平板电脑。用户导航 ListFrag > PagerFrag > DetailFrag。然后,用户改变设备方向。我必须“杀死”Pager 和 DetailFrag,使用其他 xml 布局(并排显示 2 个片段的布局)重新创建 ListFrag,并在此处填充 DetailFrag。
它正在工作,但所有这些变通办法都很丑陋,而且确实非常不符合最佳实践。它使代码的维护/重用变得非常无聊。
我使用一个 ViewModel 来连接 Activity 和 3 个 Fragment,并且使用 LiveData 我设法在 UI 中正确显示信息。项目的数据不是问题,只是所有这些片段之间的向后导航。
我尝试在重新创建 Activity 或用户导航返回时处理每种特定情况,但我不喜欢这种方法。
我目前的解决方案是这样的:
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 重新创建(方向更改)的情况。
所以我希望找到一种简单的方法来在 Fragment 之间向后导航,而无需检查诸如“用户是否在横向模式下使用平板电脑并且他是否正在查看 DetailFrag?所以这样做,这个和那个。” 目前我宁愿避免使用新的 AndroidX Navigation,因为我正在处理一个(有些)复杂的项目。
感谢您抽出宝贵时间,如果我需要提供更多信息/上下文,请告诉我!
【问题讨论】:
-
你的药在这里:developer.android.com/guide/navigation/… .. 使用导航架构来解决你的问题。请不要再次使用交易。如果您使用片段,导航架构是最好的。你可以节省你的日子..
标签: android android-fragments viewmodel