【问题标题】:Using fragment more than one time with new values with backstack maintain通过 backstack 维护多次使用 Fragment 和新值
【发布时间】:2014-11-27 09:44:43
【问题描述】:

我正在使用底部的 滑动菜单tab 制作应用程序...整个应用程序是基于 fragment 的..我面临一些问题问题是我正在使用 fragment A 然后单击一个按钮并转到 fragment B,在 Fragment B 中有一个单击按钮片段A的这个按钮将更新为新的值..等等

意味着应该发生从 A->B 的切换..但是 backstack 也应该是维护的..

这是我的 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();
}

这里我只用这个方法去下一个片段。并且后退按钮已经被活动的后退所维护。 当我使用此方法并再次调用 Fragment A(已经在容器中)时,它不会被调用......如果我使用 gotoFragment 方法,它会被调用,但是旧的 Fragment 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 on backpressed:A

请帮助我。在此先感谢。

fragment ..I 的新实例是这样的:

    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;

}

【问题讨论】:

  • 为每个片段创建一个新实例。看起来您正在使用每个中的 1 个并来回切换
  • 感谢您的回复,但我已经在它们之间切换了无数次(如用户所愿),那么在这种情况下,我必须制作很多实例..但如果您认为有可能,请解释我的代码..
  • 你想太多了,真的没那么难。如果你让它自己处理,你不需要跟踪 backstack。您需要做的就是创建任何片段的新实例并将当前片段替换为新片段。我也无法用代码解释你和你作为人类的存在(还没有!),对不起
  • 我确信您会创建一个并尝试重用它,这很好,但您也希望旧数据保留在后台堆栈上的回收片段中。如果我是边锋,请有人纠正我,但这似乎不合逻辑。
  • 先生,请分享任何代码。我会试试的

标签: android android-fragments fragment


【解决方案1】:

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

好的,你有 FragmentAFragmentB
FragmentA 中,您将容器替换为 new FragmentB
FragmentB 开始,您想再次显示FragmentA,但使用新数据,但您还希望将原始片段与旧数据保留在后台堆栈中。它不是那样工作的。

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

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

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

现在,当您需要从 FragmentB 或其他任何地方创建新的 FragmentA 时,您只需执行以下操作,并使用您自己的方法:

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

再次重申,这只是您应该做的一个基本示例,而不是用新数据回收旧片段。您很可能无法复制/粘贴它并期望它能够工作,但它可以让您了解您需要做什么。

【讨论】:

  • 我已经尝试过这个..但是当再次重复调用前一个片段(堆栈中已经存在)时它不会被调用。我已经根据你的建议更改了我的新实例..但它不是工作...
  • 可能是因为您试图不正确地控制 backstsck。搜索如何在后按时正确控制 backstack。你肯定太努力了
  • 我已经通过一些修改再次尝试了这个..当我在 goToFragmentWithBackStack 中使用 ft.add.. 时,当需要重新生成旧片段时它不会被调用..当我使用 ft.replace 时。 . 在 goToFragmentWithBackStack 中,当我向后按下时,旧片段变成黑色。
  • 再一次,你不需要处理backstack。
  • @userAndroid... WTF 你刚才说的是什么?
【解决方案2】:
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();
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2017-04-27
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多