【问题标题】:Prevent the same Fragment to be added multiple times in popBackStack防止在popBackStack中多次添加同一个Fragment
【发布时间】:2019-12-23 03:37:15
【问题描述】:

我的活动由 3 个嵌套片段组成。有我的MainFragment默认显示,ProductFragment可以从它调用,然后DetailFragment可以从ProductFragment调用。

我可以在ProductFragmentDetailFragment 之间来回切换。通过这样做,popStackBack 方法正在累积相似的片段。然后,如果我点击后退按钮,它会按照我调用它们的次数返回所有片段。

避免将相同的片段保留在后堆栈中的正确方法是什么?

编辑:

我首先调用我的主要片段:

    if (savedInstanceState == null) {
        getFragmentManager()
            .beginTransaction()
            .add(R.id.container, new SearchFragment(), "SEARCH_TAG")
            .commit();
    }

这里是调用活动片段的代码:

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(R.animator.enter_from_bottom, R.animator.exit_to_top, R.animator.enter_from_bottom, R.animator.exit_to_top);
    ft.replace(R.id.container, new FactFragment(), "FACT_TAG");
    ft.addToBackStack("FACT_TAG");
    ft.commit();

然后,点击后退:

@Override
public void onBackPressed() {
    getFragmentManager().popBackStack();
}

我试图获取当前片段的标签并执行一些与之相关的特定代码,但效果不佳。我还尝试 addToBackStack() 仅当当前 Fragment 尚未添加到 backStack 时,但它弄乱了我的 Fragment 视图。

【问题讨论】:

标签: android android-fragments nested


【解决方案1】:

使用片段的方法isAdded() 来评估插入。例如:

if(!frag.isAdded()){
   //do fragment transaction and add frag
}

【讨论】:

【解决方案2】:

这是我的解决方案。也许很脏,但它有效。我实现了一个方法,该方法返回在单击后退按钮之前显示的片段标记:

public String getActiveFragment() {

    if (getFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }

    String tag = getFragmentManager()
        .getBackStackEntryAt(getFragmentManager()
        .getBackStackEntryCount() - 1)
        .getName();

    return tag;
}

然后,在我的onBackPressed() 方法上:

    // Get current Fragment tag
    String currentFrag = getActiveFragment();

    if(currentFrag.equals("PRODUCT_TAG")) {

        // New transaction to first Fragment
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.setCustomAnimations(R.animator.enter_from_right, R.animator.exit_to_left, R.animator.enter_from_right, R.animator.exit_to_left);
        ft.replace(R.id.container, new SearchFragment(), "MAIN_TAG");
        ft.commit();

    } else {

        // Go to Fragment-1
        getFragmentManager().popBackStack();
    }

【讨论】:

    【解决方案3】:

    这是我通过片段管理器检查重复插入的方便而简单的解决方案

    首先,我检查是否是第一次添加片段的意图,然后我检查片段是否使用片段管理器呈现

      Fragment fragment = getSupportFragmentManager().findFragmentByTag("firstFragment");
                    if (fragment == null) {
                        getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new FirstFragment(), "firstFragment")
                                .addToBackStack(null)
                                .commit();
                    }else if(!fragment.isAdded()){
                        getSupportFragmentManager().beginTransaction().add(R.id.frameLayout, new FirstFragment(), "firstFragment")
                                .addToBackStack(null)
                                .commit();
                    }
    

    【讨论】:

      【解决方案4】:

      这是我的解决方案:

      Fragment curFragment = fragmentManager.findFragmentById(R.id.frameLayout);
      if(curFragment != null
          && curFragment.getClass().equals(fragment.getClass())) return;
      
      // add the fragment to BackStack here
      

      Xamarin.Android (C#) 版本:

      var curFragment = fragmentManager.FindFragmentById(Resource.Id.frameLayout);    
      if (curFragment != null
          && curFragment.GetType().Name == fragment.GetType().Name) return;
      
      // add the fragment to BackStack here
      

      【讨论】:

        猜你喜欢
        • 2012-12-11
        • 1970-01-01
        • 2014-11-22
        • 2016-01-23
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        相关资源
        最近更新 更多