在许多片段之间向后导航的简单方法是什么?
What is a simple way to navigate backwards between many Fragments?
首先,如果这与任何线程重复,我很抱歉,我已经搜索过,但没有发现任何与我的情况真正相似的东西,或者至少没有任何东西可以帮助我解决我的问题。
基本上我想知道在以简单干净的方式调用 onBackPressed() 方法时在片段之间导航的最佳方式是什么。
我有一个 Activity 调用片段(我们称它为 ListFrag)。这个 ListFrag 显示了一个项目列表,当点击这些项目时,将调用另一个包含该项目详细信息的片段(我们称之为 DetailFrag)。这很简单并且一切正常:ListFrag 调用 DetailFrag,按下后退按钮将按预期简单地向后导航。好!
但我的问题是现在我在 ListFrag 和 DetailFrag 之间添加了一个额外的步骤。现在,ListFrag 将调用另一个名为 PagerFrag 的片段,这将允许我们通过滑动(使用 FragmentStatePagerAdapter)进行分页,一个接一个地显示多个 DetailFrag。另外,我需要支持两种情况:
案例 1:用户使用智能手机,无论设备的方向如何,导航流程都是 ListFrag > PagerFrag > DetailFrag。
案例2:用户正在使用平板电脑,如果处于纵向模式,它将作为第一个案例,但如果处于横向模式,则必须忽略 PagerFrag(我们将无法通过滑动进行分页)并在同一布局上同时显示 ListFrag 和 DetailFrag。
我又做了一些工作,它在所有情况下都运行良好。主要问题是当向后导航时:按下 BackButton 变成了一场噩梦,因为我对 FragmentManager 如何堆叠 Fragments(或 FragmentTransactions,如果我没记错的话)完全感到困惑,因为 PagerFrag 添加了多个 DetailFrag 到堆栈(寻呼机中的前一个、当前和下一个)。我必须不断检查 onBackPressed() 方法中的 "if(fragment is DetailFrag)" 才能告诉应用程序下一步要去哪里。
并考虑这种情况:用户正在纵向模式下使用平板电脑。用户导航 ListFrag > PagerFrag > DetailFrag。然后,用户更改设备方向。我必须 "kill" Pager 和 DetailFrag,用另一个 xml 布局(并排显示 2 个片段的布局)重新创建 ListFrag,并在那里膨胀 DetailFrag。
它在工作,但所有这些变通办法都很丑陋,而且真的、真的没有遵循最佳实践。它使代码非常无聊 maintain/reuse.
我正在使用一个单独的 ViewModel 连接 Activity 和 3 个片段,并且使用 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 之间向后导航,而无需检查 "Is the user using a tablet in landscape mode and is he viewing the DetailFrag? So do this, this and that."
我宁愿暂时避免使用新的 AndroidX Navigation,因为我正在处理一个(有点)复杂的项目。
感谢您的宝贵时间,如果我需要提供更多,请告诉我 info/context!
在与 Back Stack 和 onBackPressed() 方法中的所有 instance-checking 进行了更多的斗争之后,我决定再尝试一下评论中建议的 AndroidX Navigation Architecture like JDevoloper,结果是它工作得很好。这确实是一个很好的解决方案。我在 ViewPager 以及在更改设备方向时处理导航方面仍然存在一些问题,但现在一切都已解决并按预期工作。感谢您的帮助!
首先,如果这与任何线程重复,我很抱歉,我已经搜索过,但没有发现任何与我的情况真正相似的东西,或者至少没有任何东西可以帮助我解决我的问题。
基本上我想知道在以简单干净的方式调用 onBackPressed() 方法时在片段之间导航的最佳方式是什么。
我有一个 Activity 调用片段(我们称它为 ListFrag)。这个 ListFrag 显示了一个项目列表,当点击这些项目时,将调用另一个包含该项目详细信息的片段(我们称之为 DetailFrag)。这很简单并且一切正常:ListFrag 调用 DetailFrag,按下后退按钮将按预期简单地向后导航。好!
但我的问题是现在我在 ListFrag 和 DetailFrag 之间添加了一个额外的步骤。现在,ListFrag 将调用另一个名为 PagerFrag 的片段,这将允许我们通过滑动(使用 FragmentStatePagerAdapter)进行分页,一个接一个地显示多个 DetailFrag。另外,我需要支持两种情况:
案例 1:用户使用智能手机,无论设备的方向如何,导航流程都是 ListFrag > PagerFrag > DetailFrag。
案例2:用户正在使用平板电脑,如果处于纵向模式,它将作为第一个案例,但如果处于横向模式,则必须忽略 PagerFrag(我们将无法通过滑动进行分页)并在同一布局上同时显示 ListFrag 和 DetailFrag。
我又做了一些工作,它在所有情况下都运行良好。主要问题是当向后导航时:按下 BackButton 变成了一场噩梦,因为我对 FragmentManager 如何堆叠 Fragments(或 FragmentTransactions,如果我没记错的话)完全感到困惑,因为 PagerFrag 添加了多个 DetailFrag 到堆栈(寻呼机中的前一个、当前和下一个)。我必须不断检查 onBackPressed() 方法中的 "if(fragment is DetailFrag)" 才能告诉应用程序下一步要去哪里。
并考虑这种情况:用户正在纵向模式下使用平板电脑。用户导航 ListFrag > PagerFrag > DetailFrag。然后,用户更改设备方向。我必须 "kill" Pager 和 DetailFrag,用另一个 xml 布局(并排显示 2 个片段的布局)重新创建 ListFrag,并在那里膨胀 DetailFrag。
它在工作,但所有这些变通办法都很丑陋,而且真的、真的没有遵循最佳实践。它使代码非常无聊 maintain/reuse.
我正在使用一个单独的 ViewModel 连接 Activity 和 3 个片段,并且使用 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 之间向后导航,而无需检查 "Is the user using a tablet in landscape mode and is he viewing the DetailFrag? So do this, this and that." 我宁愿暂时避免使用新的 AndroidX Navigation,因为我正在处理一个(有点)复杂的项目。
感谢您的宝贵时间,如果我需要提供更多,请告诉我 info/context!
在与 Back Stack 和 onBackPressed() 方法中的所有 instance-checking 进行了更多的斗争之后,我决定再尝试一下评论中建议的 AndroidX Navigation Architecture like JDevoloper,结果是它工作得很好。这确实是一个很好的解决方案。我在 ViewPager 以及在更改设备方向时处理导航方面仍然存在一些问题,但现在一切都已解决并按预期工作。感谢您的帮助!