【问题标题】:Fragment PopBackStack片段 PopBackStack
【发布时间】:2014-11-13 23:31:29
【问题描述】:

我在使用 Fragments 并将它们弹出时遇到了一个奇怪的问题。

我有一个片段活动:

第1步:我在名为Fragment A的Starting中的该Activity的onCreate中附加一个Fragment:

这是 Fragment Activity 的 onCreate

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
    }

步骤:2 之后,我将 Fragment 替换为以下代码:

Fragment_More moreFragment = new Fragment_More();
            FragmentManager manager = getSupportFragmentManager();
            manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();

第 3 步:之后我又以同样的方式在 Fragment_More 上添加了一个 Fragment:

Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
            getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();

这是我的 Fragment 的 Activity onBackPressedButton Lisetener:

@Override
public void onBackPressed() {
    FragmentManager fm = getSupportFragmentManager();
    Fragment f = fm.findFragmentById(R.id.frameContent);

 if(fm.getBackStackEntryCount() > 1){
         fm.popBackStack();
    } else{
        finish();
    }
}

这是我遇到的问题:

当我从第 3 步按回时,它会按照 onBackPressed 的描述成功地给我上一个片段,它会弹出堆栈并将我带到上一个片段。但是从 Fragment_More 中,当我再次按下时,它会显示空白的 FRAGMENT 内容。它永远不会显示我在 Activity 的 OnCreate 的第 1 步中添加的第一个片段。

请发表评论。我做错了什么?

谢谢

【问题讨论】:

  • 您能提供给我们您使用的片段的片段类吗?
  • 我实际上看不出有什么问题,实际上我已经复制了您所描述的内容(尽可能多地)并且效果很好。我猜您没有显示代码中的某些内容。我确实注意到您正在从另一个片段内部更改活动中的片段,这可能会导致麻烦(您可能想考虑使用活动中的侦听器)。

标签: android android-fragments back-stack onbackpressed


【解决方案1】:

您不应该将您的第一个片段添加到后台堆栈,因为按回车键只会反转您所做的操作。因此,如果您替换片段并按下回,它将反转您所做的替换。但是,如果您按回“.add()”片段事务,它会简单地将其删除并显示一个空白页面。所以我认为从后台删除第一个片段应该可以解决问题。试试看,告诉我!

@Override
    protected void onCreate(Bundle savedBundleState) {
        super.onCreate(savedBundleState);
        setContentView(R.layout.activity_base_new);

        Fragement_Home home = new Fragement_Home();
        FragmentManager manager = getSupportFragmentManager();
        manager.beginTransaction().add(R.id.frameContent, home).commit();
    }

示例:

假设您有两个片段,分别称为 AB

如果你 .add() 片段 A 到页面,并且“addToBackStack()”(= 保存动作的反向)你将保存删除片段 A作为点击返回时的操作。

如果你 .replace() 片段 A 被片段 B 和 "addToBackStack()" 你将保存删除 B 和当您点击返回时添加 A 作为操作。

所以你明白为什么将你的第一个片段事务添加到后台堆栈不是一个好习惯了吗?它只会导致通过按下返回来删除片段 A,从而导致空白页面。希望这是足够的信息。

此外,一旦您将addToBackStack() 删除到您的第一个片段,您就不需要覆盖onBackPressed(),因为它会按预期工作。它只会在 backstack 中没有任何内容时完成活动,而不首先向您显示该空白页。

【讨论】:

    【解决方案2】:

    您的线路:

    if(fm.getBackStackEntryCount() > 1){
    

    应该是:

    if (fm.getBackStackEntryCount() > 0) {
    

    您将 3 个片段放在后台堆栈上。弹出前两个条目后,backstack 上的条目数等于 1。因此,您阻止自己检索添加到 backstack 的第一个片段。

    【讨论】:

      【解决方案3】:

      你正在使用这个

      manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
      

      尝试改用这个

      manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();
      

      让我知道它是否适合你。

      【讨论】:

      • 没有。它没有帮助我
      • 你能试试我的答案@GauravArora吗?
      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2018-03-11
      相关资源
      最近更新 更多