【问题标题】:Is there an easy way to prevent fragments from going back by using the back button on android有没有一种简单的方法可以通过使用android上的后退按钮来防止片段返回
【发布时间】:2021-11-01 18:32:57
【问题描述】:

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

应用程序没有使用导航组件,并且它的一个相当大的项目已经实现了,如果你按下后退按钮,就会出现登录等屏幕登录,它会带你回到登录。幸运的是,登录屏幕是一个活动,所以我可以在 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取决于场合。导航组件是最理想的方式,还是有更简单的解决方案来实现这一点,优缺点是什么?

【问题讨论】:

    标签: java android navigation back-stack fragment-backstack


    【解决方案1】:

    首先您需要记住,当用户按下后退按钮或调用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 类的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

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

    【讨论】:

    • 谢谢!我会试一试,看看什么效果最好。
    • 这可能是一个愚蠢的问题,但在这里,您在使用NacControlleronViewCreated 时还需要调用Intent i = new Intent(getActivity(), HomeActivity.class);startActivity(); 吗?
    • 不,NavController 可以使用navigate 方法完成
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多