【问题标题】:How to remove older entries of same fragment from backstack?如何从后台删除相同片段的旧条目?
【发布时间】:2016-12-20 08:01:29
【问题描述】:

我有四个片段 F1,F2,F3,F4。我正在使用替换方法来替换已添加到容器中的现有片段。他们中很少有人使用 addToBackStack(null) 添加到 backstack,很少有人使用 addToBackStack(tag) 添加。 现在通过以下方法检查片段是否已经添加或存在于事务中

public static boolean isFragmentInBackstack(final FragmentManager fragmentManager, final String fragmentTagName) {
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) {
        if (fragmentTagName.equals(fragmentManager.getBackStackEntryAt(entry).getName())) {
            return true;
        }
    }
    return false;
}

使用以下方法替换片段

 public void setFragmentToContainer(Fragment fragment) {
        final String tag = fragment.getClass().getName();
        if (manager == null) {
            manager = getSupportFragmentManager();
        }
        transaction = manager.beginTransaction();
        if (isFragmentInBackstack(manager, tag)) {
            // Fragment exists, go back to that fragment
            //// you can also use POP_BACK_STACK_INCLUSIVE flag, depending on flow
            manager.popBackStackImmediate(tag,0);
            transaction.remove(fragment);
        } else {
            // Fragment doesn't exist

        }

        transaction.replace(R.id.layout_content, fragment);

        if (fragment instanceof CompanyLevelFragment) {
            //Exit app on back press
        } else {
            if (fragment instanceof F1) {
                transaction.addToBackStack(null);
            } else {
                transaction.addToBackStack(tag);
            }

        }
        transaction.commit();
}

问题: 假设我第一次将片段 F2 添加到事务中,然后我更改了应用程序中的日期以获取特定日期的更新数据。获取更新数据后,我调用 setFragmentToContainer() 将检查 backstack 中的片段条目, isFragmentInBackstack() 将检查片段是否已经在 backstack 中,然后调用 popBackStackImmediate 删除条目。

我需要按两次后退按钮两次关闭片段 F2。如何从管理器中删除相同片段的早期空白条目?另一个例子假设如果我添加 F3 四次,那么我将不得不按四次返回按钮。

请告诉我如何在添加到后台堆栈之前删除相同片段的旧条目?

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    在使用popBackStackImmediate 之后,我能够解决我的问题。我已将POP_BACK_STACK_INCLUSIVE 添加到popBackStackImmediate

     if (isFragmentInBackstack(manager, tag)) {
               manager.popBackStackImmediate(tag,FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    } else {
                    // Fragment doesn't exist
                    // STEP 1 + additional backstack management
                }
    

    【讨论】:

      【解决方案2】:

      你好试试这个,它会帮助你首先检查片段不为空。

      Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
      if(fragment != null)
      getSupportFragmentManager().beginTransaction().remove(fragment).commit();
      

      【讨论】:

      • 嘿,罗比,谢谢,但我能够解决我的问题,看看我的回答
      • 哦,我知道,但在另一种情况下,这可能也会对您有所帮助
      【解决方案3】:

      使用这个

      Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
      if(fragment!=null){
         getSupportFragmentManager().beginTransaction().remove(fragment);
      }
      

      【讨论】:

      • 不改变结果
      【解决方案4】:

      添加新片段时,只需为该片段添加TAG。 使用该TAG,您可以轻松删除旧片段。 例如。

      FragmentManager  fm = getSupportFragmentManager();
      fm.replace(R.id.container,new MyFragment(),"TAG_FRAGMENT1").commit(); 
      

      要删除旧片段,请使用以下代码,

      Fragment oldFragment = fm.findFragmentByTag("TAG_FRAGMENT1");
      if(oldFragment!=null){
              fm.beginTransaction().remove(oldFragment).commit();
          }
      

      删除旧片段后,您可以添加新片段。

      【讨论】:

        【解决方案5】:

        你是不是在使用replace()的时候不加标签

        transaction.replace(R.id.layout_content, fragment);
        

        应该是这样的:-

        transaction.replace(R.id.layout_content, fragment, "CLASS_NAME");
        

        这里的类名将是标签,传递你正在打开的片段类的名称,它可以是任何东西,但在你的情况下是类名,因为在删除时你将标签设置为类名,

        final String tag = fragment.getClass().getName();
        

        所以删除时应该是这样的

        ClassGridFragment gridFragment = (ClassGridFragment) getFragmentManager().findFragmentByTag("CLASS_NAME");
                if (gridFragment != null && gridFragment.isVisible()) {
                    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.remove(gridFragment);
                    ft.commit();
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-21
          • 2021-10-14
          • 1970-01-01
          • 2015-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-10
          相关资源
          最近更新 更多