如何使用基于标记的另一个片段替换片段管理器中的现有片段

时间:2015-12-27 06:41:00

标签: java android android-fragments

我有一个将使用片段显示数据的活动,对于每个片段,我将唯一ID作为标记,如下所示:

public class MyActivity .... {

    void addFragment(String id){
        // this is how i add a new fragment
        FragmentTransaction fTrans = getFragmentManager().beginTransaction();

        AnyFragment frag = new AnyFragment();

        fTrans.add(R.id.container, frag, id);
        fTrans.commit();
    }

    void replaceFragment(String id){
        // this is how i replace the fragment with tag 'id' with new fragment
        FragmentTransaction fTrans = getFragmentManager().beginTransaction();

        AnyFragment newFrag = new AnyFragment();
        fTrans.replace(R.id.container, newFrag, id);
        fTrans.commit();
    }

}

在我的示例中,我添加了2个带标记的片段' data1 '和' data2 '。

当我试图用标签' data1 '替换片段时或者' data2 ',它总是替换添加第一次的片段,当我第二次更换时,它会替换第二添加片段。

当我替换3次时,它只留下一个片段而另一个片段消失了。

我的问题是:

我想用新片段替换带有指定标签的片段,怎么做?在我的代码中替换有什么问题吗?

我可以使用替换方法吗?或者我必须首先使用指定标签删除片段然后添加具有相同标签的新片段?这样做的最佳方法是什么?如果你能为每种方法提供一些解释,那就太好了。

任何答案都将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

在你的情况下你真的不需要标签:

检查Android开发者的method description

  

替换添加到容器的现有片段。这与使用相同的containerViewId添加的所有当前添加的片段调用remove(Fragment),然后使用此处给出的相同参数添加(int,Fragment,String)基本相同。

所以你要做的就是:

  1. onCreate()活动期间(或实际需要实例化片段时) - 使用新片段填充容器: getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentA.class.getName())).commit();

  2. 一旦你需要用FragmentB替换FragmentA,你只需要打电话 getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentB.class.getName())).commit();(即需要标签 - R.id.container同时只有一个片段)

  3. 如果您不想replace个片段(首选解决方案),您可以在活动的onCreate()add()两个片段,以及然后分别使用show()hide()方法:

        Fragment fragmentA = Fragment.instantiate(this, FragmentA.class.getName());
        Fragment fragmentB = Fragment.instantiate(this, FragmentA.class.getName());
        ..
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, fragmentA)
                .add(R.id.container, fragmentB)
                .show(fragmentA)
                .hide(fragmentB)
                .commit();
    
        ..
        // Once you want to show fragment B instead of fragment A
        getSupportFragmentManager().beginTransaction()
                .show(fragmentB)
                .hide(fragmentA)
                .commit();
    
    关于编辑现有片段的

    UPD:

    在您的活动中,一旦发生某些事情并且您想要更新片段 - 请执行以下操作:

    1. onCreate()(或任何其他合适的位置)中,您可以将片段添加到容器(R.id.container)中: getSupportFragmentManager().beginTransaction().replace(R.id.container, Fragment.instantiate(this, FragmentA.class.getName())).commit();

    2. 在您要更新的位置 - 执行以下操作:

      Fragment f = getSupportFragmentManager().findFragmentById(R.id.container);
      if (f instanceof FragmentA) {
          // doSomething() is a public method of FragmentA;
         ((FragmentA)f).doSomething();
      }
      
    3. 我希望,这有帮助