【问题标题】:Android BackStack issueAndroid BackStack 问题
【发布时间】:2015-07-04 18:14:16
【问题描述】:

我在解决 BackStack 的问题时遇到了问题。我有 3 个由 Activity 管理的片段:

我使用这段代码的片段之间的导航:

private void showFragment(BabysitFragment babysitFragment, UserRequest userRequest) {
   FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
   switch (babysitFragment) {
      case CHILDREN_OVERVIEW:
        toolbar.setVisibility(View.VISIBLE);
        Fragment childrenSpecification = ChildrenOverviewFragment.newInstance(userRequest);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.replace(R.id.fragment_container, childrenSpecification, BabysitFragment.CHILDREN_OVERVIEW.getSimpleName()).commit();
        break;
      case CHILD_SPECIFICATION:
        toolbar.setVisibility(View.VISIBLE);
        Fragment childSpecification = ChildSpecificationFragment.newInstance(userRequest);
        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.replace(R.id.fragment_container, childSpecification, BabysitFragment.CHILD_SPECIFICATION.getSimpleName()).commit();
        break;
   }
}

//Gets called by FinalizeFrag and ChildSpecificationFrag
@Override
public void onChildrenOverviewNeeded(UserRequest userRequest) {
    showFragment(BabysitFragment.CHILDREN_OVERVIEW, userRequest);
}

//Gets called by ChildrenOverviewFrag
@Override
public void onChildSpecificationNeeded(UserRequest userRequest) {
    showFragment(BabysitFragment.CHILD_SPECIFICATION, userRequest);
}

我希望用户能够使用其他 2 个片段的后退按钮返回到 FinalizeFrag。这适用于当前代码,但在 1 个流程中我确实遇到了问题:

  1. 用户将新的“孩子”保存在 ChildSpecificationFrag 中(工具栏中的保存图标)
  2. 用户被重定向到 ChildrenOverviewFrag
  3. 用户按下返回按钮
  4. 停留在 ChildrenOverviewFrag 上(应该重定向到 FinalizeFrag)

注意:当我再次按下按钮时,它会重定向到 FinalizeFrag

点击关闭按钮时的代码(ChildSpecificationFragment):

if (id == android.R.id.home) {
  getActivity().onBackPressed();
}

点击保存按钮时的代码(ChildSpecificationFragment):

...
userRequest.getFamilyDetails().getChildren().add(child);
getActivity().getSupportFragmentManager().popBackStackImmediate();
onChildrenOverviewNeededListener.onChildrenOverviewNeeded(userRequest, this);

如您所见,我正在从 BackStack 中删除 Fragment。我究竟做错了什么?提前致谢!

【问题讨论】:

    标签: android android-fragments back-stack fragment-backstack


    【解决方案1】:

    在执行“用户被重定向到 ChildrenOverviewFrag”之前不要调用 addToBackStack,

    【讨论】:

    • 在 CHILDREN_OVERVIEW 或 CHILD_SPECIFICATION 的情况下?你也能解释一下为什么吗?谢谢!
    • 两个都试试。请让我知道它是否有效。我很久以前就用过它,它确实对我有用。
    • 我已将其替换为 'fragmentTransaction.addToBackStack("scheduleFragment");'在这两种情况下,但我仍然需要在 ChildrenOverviewFrag 中单击 2 次才能返回 FinalizeFrag。
    • 看来onbackstackchangedlistener可以解决你的问题
    • 它有什么帮助?
    【解决方案2】:

    我觉得

    fragmentTransaction.addToBackStack(null); 
    

    将片段添加到后台堆栈。

    public abstract boolean popBackStackImmediate (String name, int flags) 
    

    如果有东西弹出,则返回 true,否则返回 false。

    【讨论】:

    • 我不确定你的意思,这是我在文档上找到的:像 popBackStack(),但在调用内部立即执行操作。这就像事后调用 executePendingTransactions() 一样。如果有东西弹出,则返回 true,否则返回 false。在我看来,它确实弹出了最新添加的项目。
    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多