使用片段多次使用带有backstack维护的新值

时间:2014-11-27 09:44:43

标签: android android-fragments fragment

我正在底部使用滑动菜单标签制作应用...整个应用基于片段 ...我正面临一些问题是我正在使用片段A 然后点击按钮然后转到片段B ,在片段B 中点击一个按钮此按钮片段A 将使用新值更新..依此类推

意味着从A-> B切换应该发生..但背斜也应该是保持...

以下是 BackStack 的代码:

public static void goToFragmentWithBackStack(Fragment fragment) {
    Fragment tmp = fm.findFragmentByTag(fragment.getClass().getName());
    if (tmp != null && tmp.isVisible())
        return;

    ft = fm.beginTransaction();
    ft.add(R.id.content_frame, fragment, fragment.getClass().getName());
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(null);
    ft.commit();
    currentTag = fragment.getClass().getName();
}

这里我只使用这种方法转到下一个片段。并且后退按钮已经被活动的反向按下了。 当我使用此方法并再次调用片段A(已经在容器中)时,它不会被调用 ...如果我使用 gotoFragment 方法,则调用它但是旧片段A被销毁(将出现空白屏幕)。这是我的 gotoFragment 方法:

public static void goToFragment(Fragment fragment) {
    Fragment tmp = fm.findFragmentByTag(fragment.getClass().getName());
    if (tmp != null && tmp.isVisible())
        return;

    ft = fm.beginTransaction();
    ft.replace(R.id.content_frame, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();
    currentTag = fragment.getClass().getName();
    Log.d("Trong", "BackPressedcurrentTag " + currentTag);
}

我使用此概念重用已使用的片段:Android - Instantiate a Fragment multiple times

但它没有帮助。让我再次明确我的问题:

我想在容器中一次又一次地使用已使用的片段,所有片段也应该在后面调用

流程应该是这样的:A-> B-> A-> B-> A AND背压:A< -B< -A< -B< -A (每次A都有新值,新数据)

请帮帮我。谢谢。

我所做的片段的新实例是这样的:

    public static FollowerFragment newInstance() {
    return new FollowerFragment(null,null,null);
}

public static Fragment newInstance(String cat_id,String status,String id) {
    return new FollowerFragment(cat_id,status,id);
}
public FollowerFragment(String cat_id,String status,String id) {
    // TODO Auto-generated constructor stub
    this.str_status=cat_id;
    this.counter = status;
    this.user_id = id;

}

2 个答案:

答案 0 :(得分:0)

这基本上是一个扩展的评论,以更好地帮助OP了解需要做什么。

好的,您有FragmentAFragmentBFragmentA范围内,您可以使用 FragmentB替换容器 从FragmentB开始,您希望再次显示FragmentA,但需要使用新数据,但您还希望将原始片段与旧数据一起保留在Backstack中。它不像那样工作。

以下是您应该实现目标的方向的一个非常简化的示例。

由于您希望在每个片段上显示不同的信息,因此每个片段的构造函数应该包含一种告诉它应该显示的内容的方法,例如:

public class FragmentA{
    String mText;
    public FragmentA(String text){
        mText = text;
    }
}

现在,当您需要在FragmentA内或任何地方创建新的FragmentB时,您只需执行诸如此类操作,并使用您自己的方法:

goToFragmentWithBackStack(new FragmentA("this is the new data"));

同样,这只是您应该做的事情的基本示例,而不是使用新数据回收旧片段。你很可能无法复制/粘贴它并期望它能够工作,但它可以让你知道你需要做什么。

答案 1 :(得分:0)

public static void goToFragmentWithBackStack(Fragment fragment) {
    Fragment tmp = fm.findFragmentByTag(fragment.getClass().getName());
    if (tmp != null && tmp.isVisible())
        return;

    ft = fm.beginTransaction();
    ft.add(R.id.content_frame, fragment, fragment.getClass().getName());
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
//  ft.addToBackStack(null);
//  you are suppose to pass string as the parameter that will be unique to identity your
//   fragment on the backstack
    ft.commit();
    currentTag = fragment.getClass().getName();
}

如果您选择利用后端堆栈来获取片段,则此标记应为 适当的字符串名称,表示时间段的片段状态 交易。您将能够使用标记值来查询代码中的后台堆栈 删除条目,以及关闭弹出条目。你会想要有意义的标签 交易能够在以后找到合适的交易。

每次使用backstack进行片段转换时,尝试生成唯一的字符串

pubic static int mCount = 0 ;
pubic static String mFragmentTag = "frag_tag_" ;

     public static void goToFragmentWithBackStack(Fragment fragment) {
            Fragment tmp = fm.findFragmentByTag(fragment.getClass().getName());
            if (tmp != null && tmp.isVisible())
                return;

            ft = fm.beginTransaction();
            ft.add(R.id.content_frame, fragment, fragment.getClass().getName());
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            ft.addToBackStack(mFragmentTag+mCount);
            mCount+=1;
        //  you are suppose to pass string as the parameter that will be unique to identity your
        //   fragment on the backstack
            ft.commit();
            currentTag = fragment.getClass().getName();
        }