用新堆栈替换片段后栈

时间:2011-06-07 00:23:20

标签: java android-fragments android

我正在尝试使用基于通过网络连接返回的某些信息生成的片段来完全替换片段后备栈。我首先将后端堆栈弹出到我想要的位置(这很好......但是为了简单起见,我可以说我弹出到根目录),然后我尝试构建并应用这样的片段堆栈:

ArrayList<JSONObject> crumbsOut = new ArrayList<JSONObject>(count);

//.... pop the back stack to a certain point

//replace entire nav. backstack
final FragmentTransaction transaction = this.getActivity().getSupportFragmentManager().beginTransaction();
for(int i = 0; i<count; i++)
{
  final JSONObject item = crumbsOut.get(i);
  final String id = item.getString("id");

  FolderFragment currentFolder = new FolderFragment();//fragment displays folder contents
  Bundle args = new Bundle();
  args.putString(DATA_ITEM_ID_KEY, id);
  args.putString(DATA_ITEM_NAME_KEY, item.getString("displayname"));
  currentFolder.setArguments(args);

  transaction.replace(R.id.MasterContainer, currentFolder);
  transaction.addToBackStack(id);
}

// Commit the transaction
transaction.commit();

当我运行它时,最顶层的FolderFragment正确显示,但是当我点击后退按钮(或弹出堆栈)时,视图将恢复到上述代码运行之前的那一刻(即不返回在我用循环创建的新片段堆栈中,我在尝试添加/创建此堆栈之前返回到状态。

如果有帮助,我在项目中使用Android兼容包。

请帮忙。感谢

2 个答案:

答案 0 :(得分:5)

我找到了答案。您必须为要添加到堆栈的每个新片段创建唯一的事务。我原本以为这不是必要的,但我想这并非如此。所以,答案是:

ArrayList<JSONObject> crumbsOut = new ArrayList<JSONObject>(count);

//.... pop the back stack to a certain point

//replace entire nav. backstack

for(int i = 0; i<count; i++)
{
  //move the transaction into the loop
  final FragmentTransaction transaction = this.getActivity().getSupportFragmentManager().beginTransaction();
  final JSONObject item = crumbsOut.get(i);
  final String id = item.getString("id");

  FolderFragment currentFolder = new FolderFragment();//fragment displays folder contents
  Bundle args = new Bundle();
  args.putString(DATA_ITEM_ID_KEY, id);
  args.putString(DATA_ITEM_NAME_KEY, item.getString("displayname"));
  currentFolder.setArguments(args);

  transaction.replace(R.id.MasterContainer, currentFolder);
  transaction.addToBackStack(id);

  // Commit the transaction
  //move the commit into the loop
  transaction.commit();
}

答案 1 :(得分:0)

可能是你在同一个方法中做了所有事情而你的beginTransaction()调用正在取消pop(FragmentManager无疑开始一个事务来做pop).-

我建议使用相同的FragmentTransaction自行清理,只执行一次提交。或者,您可以将替换调用发布到主线程消息队列中,以便稍后执行。

当你使用compat库时,你总是可以调试源代码来查看正在发生的事情。