【问题标题】:Keeping the back stack after it is being cleared by opening a new activity通过打开一个新活动来清除它后保留后退堆栈
【发布时间】:2014-08-20 17:22:14
【问题描述】:

在我的应用程序的主要活动中,有一个托管片段的容器。
当用户单击“默认”片段(显示的第一个片段)中的按钮时,片段会发生变化,操作栏按钮也会发生变化。

这个新片段的操作栏中的一个按钮打开另一个活动。

在那个 Activity 中,当用户点击后退按钮时,Activity 关闭,MainActivity 中显示的片段(打开新 Activity 的片段)仍然存在(这很好)。

但是,如果用户再次单击后退按钮,它不会返回到上一个片段。当 Activity 未打开时它会返回。

事实证明,打开活动会清除后台堆栈(由 Logging 验证来自 FragmentManager 类的计数),虽然我不太确定这是否应该表现得像这样,它有点说得通。不幸的是,这不是我想要的行为。

MainActivity: Fragment A (default) ---> Fragment B ---> Acivity B

因此,我的问题是如何在活动恢复后保留后台堆栈(如果有的话)?

我尝试搜索类似的问题,但我发现的所有问题实际上都是问如何清除 backstack。

【问题讨论】:

    标签: java android android-fragments back-stack


    【解决方案1】:

    试试看:

    @Override
    public void onBackPressed() {
        Intent intent = new Intent(A_Acticity.this, B_Activity.class);
        startActivity(intent);
    }
    

    希望对您有所帮助! :)

    【讨论】:

      【解决方案2】:

      阅读documentation,有一种方法可以根据事务名称或提交提供的 id 弹出回栈。使用该名称可能更容易,因为它不需要跟踪可能更改的数字并强化“唯一的回栈条目”逻辑。

      由于每个 Fragment 只需要一个后退堆栈条目,因此将后退状态名称设为 Fragment 的类名 (via getClass().getName())。然后在替换 Fragment 时,使用popBackStackImmediate() 方法。如果它返回 true,则意味着在后堆栈中有一个 Fragment 的实例。如果没有,实际执行Fragment替换逻辑。

      private void replaceFragment (Fragment fragment){
        String backStateName = fragment.getClass().getName();
      
        FragmentManager manager = getSupportFragmentManager();
        boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);
      
        if (!fragmentPopped){ //fragment not in back stack, create it.
          FragmentTransaction ft = manager.beginTransaction();
          ft.replace(R.id.content_frame, fragment);
          ft.addToBackStack(backStateName);
          ft.commit();
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-05
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        相关资源
        最近更新 更多