gpt4 book ai didi

java - 如何根据标签用另一个 fragment 替换 fragment 管理器中的现有 fragment

转载 作者:太空狗 更新时间:2023-10-29 14:52:03 26 4
gpt4 key购买 nike

我有一个将使用 fragment 显示数据的 Activity ,对于每个 fragment ,我都将唯一 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();
}

}

在我的示例中,我添加了带有标签“data1”和“data2”的 2 个 fragment 。

当我尝试用标签“data1”或“data2”替换 fragment 时,它总是替换添加first的 fragment > 当我第二次替换时,它替换了second 添加的 fragment 。

当我替换 3 次时,它只留下一个 fragment ,另一个 fragment 不见了。

我的问题是:

我想用一个新 fragment 替换带有指定标签的 fragment ,怎么办?我的代码中的替换有问题吗?

我可以使用替换方法吗?或者我必须先使用删除具有指定标签的 fragment 然后添加具有相同标签的新 fragment ?最好的方法是什么?如果您能对每种方法给出一些解释,那就太好了。

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

最佳答案

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

检查 Android Developer 上的 method description:

Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.

所以你要做的就是:

  1. 在 Activity 的 onCreate() 期间(或任何您实际需要实例化 fragment 的时候)- 用新 fragment 填充容器: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同时只有一个 fragment )

如果您不想替换 fragment (这是首选解决方案),您可以在 Activity 的onCreate() add()两个 fragment ,然后分别使用 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:关于编辑现有 fragment :

在您的 Activity 中,一旦发生某些事情并且您想更新 fragment - 执行此操作:

  1. onCreate()(或任何其他合适的地方)中,您将 fragment 添加到容器中(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();
    }

希望对你有帮助

关于java - 如何根据标签用另一个 fragment 替换 fragment 管理器中的现有 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34478222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com