繁体   English   中英

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

[英]how to replace existing fragment in a fragment manager with another fragment based on tag

我有一个活动,将使用片段显示数据,对于每个片段,我给出唯一的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次时,它只留下一个片段而另一个片段消失了。

我的问题是:

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

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

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

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

检查Android Developer上的方法说明

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

所以你要做的就是:

  1. 在Activity的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同时只有一个片段)

如果您不想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:关于现有片段的编辑:

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

  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(); } 

我希望,这有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM