【问题标题】:How to manage fragments in backstack?如何管理 backstack 中的碎片?
【发布时间】:2017-04-01 06:41:11
【问题描述】:

我正在尝试以一种非常简单的方式管理片段。我创建了一个实用程序类,它向后台堆栈添加片段,当我们按下后退按钮时,前一个片段会显示出来。我同意。但是,当我试图清除所有片段并显示根片段时,我无法正确执行此操作。以下是我的实用程序类:

public class FragmentUtil {
private FragmentUtil() {
}

public static void animatedReplace(FragmentActivity activity, int containerId, Fragment fragment, Bundle args, boolean addToBackStack){
    FragmentTransaction transaction=activity.getSupportFragmentManager().beginTransaction();
    fragment.setArguments(args);
    if(addToBackStack){
        transaction.addToBackStack(fragment.getClass().getName());
    }
    transaction.setCustomAnimations(R.anim.slide_from_right, R.anim.slide_to_left,R.anim.slide_from_left,R.anim.slide_to_right);
    transaction.replace(containerId,fragment);
    transaction.commit();
}

public static void clearBackStackToHome(FragmentActivity activity){
    FragmentManager manager = activity.getSupportFragmentManager();
    manager.popBackStack(DashboardFragment.class.getName(),FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}

当我想要另一个片段时,我只需在 animatedReplace 方法中为 addToStack 传递“true”。当我想清除后台堆栈时,我传递“false”并调用 clearBackStackToHome 方法。谁能帮我解决我做错了什么?

【问题讨论】:

    标签: android android-fragments fragment-backstack


    【解决方案1】:

    设置 check backStack 是否为空的条件。当从 backStack 中删除所有片段时,然后显示您的根片段

    【讨论】:

      【解决方案2】:

      试试这个:

      在您的实用程序类中:

      public void clearBackStack() {
          FragmentManager manager = activity.getSupportFragmentManager();
          if (manager.getBackStackEntryCount() > 0) {
              FragmentManager.BackStackEntry first = manager
                      .getBackStackEntryAt(0);
              manager.popBackStack(first.getId(),
                      FragmentManager.POP_BACK_STACK_INCLUSIVE);
          }
      }
      

      确保在您的根/第一个片段animatedReplace() 中传递boolean addToBackStack = false

      这样就不会被清除了。

      编辑

      要在OnBackPressed() 中使用它,请在您的活动中覆盖onBackPressed() 并添加以下代码:

       @Override
          public void onBackPressed() {
              FragmentManager fm = getSupportFragmentManager();
              if (fm.getBackStackEntryCount() > 0) {
                   FragmentManager.BackStackEntry first = fm
                          .getBackStackEntryAt(0);
                  fm.popBackStack(first.getId(),
                          FragmentManager.POP_BACK_STACK_INCLUSIVE);
                  Log.i("MainActivity", "popping backstack");
              } else {
                   super.onBackPressed(); 
              }
          }
      

      【讨论】:

      • 嗨 rafsanahmad007!该解决方案运行良好。但是,如何在 onBackPressed() 上实现呢?
      • 每次用户点击返回按钮时都会发生这种情况。我只想在某个过程之后发生。例如,完成支付过程后,用户可以点击返回按钮并导航到根片段。
      • 你可以在onBackPressed()处添加一个if条件......这样如果条件满足......那么内部代码就会执行
      【解决方案3】:

      是的,您可以在 MainActivity 的 onBackPressed() 方法中管理片段后按。 只需覆盖 onBackPressed() 并检查 backStack 计数,如果计数为零,则导航到您的根片段或退出应用程序。此外,您可以根据检查返回堆栈中的哪个片段来实现您的代码。

      @Override
      public void onBackPressed() {
      
      
          FragmentManager fm = getSupportFragmentManager();
          int count = fm.getBackStackEntryCount();
          if (count >= 1) {
              if (fm.findFragmentById(R.id.main_container) instanceof yourFragment) {
      
                  super.onBackPressed();
      
              }
          } else {
              // Show your root fragment  here
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-09
        • 2010-12-13
        • 1970-01-01
        • 2013-04-20
        相关资源
        最近更新 更多