Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在多个片段之间向后导航的简单方法是什么?_Android_Android Fragments_Viewmodel - Fatal编程技术网

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

Android 在多个片段之间向后导航的简单方法是什么?,android,android-fragments,viewmodel,Android,Android Fragments,Viewmodel,首先,我很抱歉,如果这是重复的任何线程,我已经搜索,我没有发现任何真正类似的情况,或至少没有什么可以帮助我解决我的问题 基本上,我想知道当以一种简单明了的方式调用onBackPressed()方法时,在片段之间导航的最佳方式是什么 我有一个调用片段的活动(我们称之为ListFrag)。此ListFrag显示了一个项目列表,单击该列表时,将调用另一个包含该项目详细信息的片段(我们称之为DetailFrag)。这很简单,一切都很好:ListFrag调用DetailFrag,按Back按钮只需按预期向

首先,我很抱歉,如果这是重复的任何线程,我已经搜索,我没有发现任何真正类似的情况,或至少没有什么可以帮助我解决我的问题

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

我有一个调用片段的活动(我们称之为ListFrag)。此ListFrag显示了一个项目列表,单击该列表时,将调用另一个包含该项目详细信息的片段(我们称之为DetailFrag)。这很简单,一切都很好:ListFrag调用DetailFrag,按Back按钮只需按预期向后导航即可。好!

但我的问题是,现在我在ListFrag和DetailFrag之间增加了一个步骤。现在,ListFrag将调用另一个名为PagerFrag的片段,这将允许我们通过滑动(使用FragmentStatePagerAdapter)进行分页,依次显示多个细节片段。另外,我需要支持两个案例:

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

案例2:用户正在使用平板电脑,如果处于纵向模式,平板电脑将作为第一个案例使用,但如果处于横向模式,平板电脑将不得不忽略页面标签(我们无法通过滑动进行分页),并在同一布局上同时显示ListFrag和DetailFrag

我又做了一些工作,在所有情况下都非常有效。主要问题是向后导航时:按下BackButton变成了一场噩梦,因为我完全不知道FragmentManager是如何堆叠片段的(或者FragmentTransactions,如果我没有错的话),因为PagerFrag向堆栈中添加了多个DetailFrag(页面中的上一个、当前和下一个)。我必须经常检查onBackPressed()方法中的“if(fragment is DetailFrag)”,才能告诉应用程序下一步要去哪里

想象一下这种情况:用户在纵向模式下使用平板电脑。用户导航ListFrag>PagerFrag>DetailFrag。然后,用户更改设备方向。我必须“杀死”寻呼机和DetailFrag,用另一个xml布局(并排显示两个片段的布局)重新创建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()
        }

    }
片段的onCreatedView()方法中还有几行代码,用于在重新创建活动(方向更改)时处理

因此,我希望找到一种简单的方法,在片段之间向后导航,而不必检查“用户是否在横向模式下使用平板电脑,他是否正在查看DetailFrag?所以做这个,这个和那个。” 目前我宁愿避免使用新的AndroidX导航,因为我正在处理一个(有些)复杂的项目


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

在与Back Stack和onBackPressed()方法中的所有实例检查进行了更多的斗争之后,我决定按照注释中的建议进行另一次尝试,结果证明它工作得非常好。这确实是一个伟大的解决办法。我仍然有一些问题与ViewPager和处理导航,同时改变设备的方向,但现在一切都解决了,并按预期工作。谢谢你的帮助

你的药在这里:。。使用导航架构解决您的案例。请不要再次使用事务处理。如果您使用的是片段,那么导航架构是最好的。你可以节省你的时间。。