有没有一种简单的方法可以通过使用 android 上的后退按钮来防止片段返回

Is there an easy way to prevent fragments from going back by using the back button on android

我试图找到一个简单的解决方案,而不会使事情过于复杂,以防止应用程序中的某些屏幕在使用 android 设备的后退按钮时返回,但是,我不确定哪种方法是最适合我的情况。

应用程序没有使用导航组件并且它相当大的项目已经实现了,有登录等屏幕如果您在登录后按后退按钮,它将带您回到登录状态。幸运的是,登录屏幕是一个 activity,所以我可以在 startActivity(i); 之后执行 finish(); 并对其进行排序,但是,登录后有多个片段导致重复和重新 -只需按后退按钮即可输入您不想输入的值。

我目前正在做的是 fragmentTransaction.addToBackStack(null); 在我做之前 commit(); 我尝试删除我不想要的 fragmentTransaction.addToBackStack(null); 并且它有点工作但它不会带你当您使用后退按钮返回到特定屏幕时,它会将您带到上次使用的 fragmentTransaction.addToBackStack(null);,这在某些情况下会造成混淆。

我经常做的事的例子:

  Fragment enqFragment = new EnqFragment();
  //Fragment findCustomerFragment = new AppInformationFragment();
  FragmentTransaction transaction = requireActivity().getSupportFragmentManager().beginTransaction();

  // Replace whatever is in the fragment_container view with this fragment,
  // and add the transaction to the back stack if needed
  transaction.replace(R.id.fragment_container, enquiryFragment);
  transaction.addToBackStack(null); // I would comment this out if I did not want to go back here
  transaction.commit();

我想做的是从 A 到 B 再到 C,但是当我按下返回键时,我想返回到 A,在某些情况下,当 C 转到 D 并按下返回键时,我想再次返回到 A或 B 视情况而定。导航组件是实现此目的的最理想方法还是有更简单的解决方案来实现此目的,优缺点是什么?

首先您需要记住,当用户按下后退按钮或调用 onBackPressed 时,默认行为是从堆栈中弹出最新的片段。您可以按如下方式自定义此行为,因为它比在每种情况下覆盖 onBackPressed

更容易

使用 Jetpack 中引入的导航组件

解决方案 1:

app:popUpToapp:popUpToInclusive 正是您要找的东西

通过文档,xml 属性将

导航前弹出给定目的地。这将从返回堆栈中弹出所有不匹配的目的地,直到找到该目的地

让我用三个片段ABC

向您解释一下
A (start) -> B -> C
   

如果我想导航到 C 并弹出所有 包括 A(startscreen) 然后代码将是:

 <action
            android:id="@+id/B_to_C"
            app:destination="@id/C"

            app:popUpTo="@+id/A"
            app:popUpToInclusive="true" />

如果我想导航到 C 并弹出除 A 之外的所有内容,那么代码将是:

  <action
            android:id="@+id/action_B_to_C"
            app:destination="@id/C"

            app:popUpTo="@+id/A"/>

解决方案 2:

使用 NavController class 的 popBackStack 方法,它与 onBackPressed 的工作相同,但方式优雅

如果您有三个片段:ABC

并且您目前在片段 C 中,并希望在导航到任何地方之前返回到 A(如果您愿意,也可以不导航到任何地方)

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentB, true);

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentA, false);

其中 truefalse 将指示您是否真的希望目的地保留(false)或也从堆栈中弹出(true

在没有导航组件的情况下使用相同的组件,即较旧的 FragmentManager class

上面的示例很好地解释了行为,但是您可以使用 popBackStack 之类的方法及其 variations