Android 通过 popBackStack 返回上一个片段

Android Back to previous fragment by popBackStack

我有3个片段:Home,A和B。Home和A在手机导航菜单里。

用户从 A 转到 B,然后按返回按钮。如果我使用 getFragmentManager().popBackStack(); 片段 A 的 onCreateView 的问题正在调用并且我有重复的内容。

但是如果我使用 getActivity().onBackPressed(); 它会转到 Home 片段而不是 A.

如何在不刷新视图的情况下点击后退按钮显示片段A?

这是我从 A 到 B 的交易方式

 CertificateItemFragment certificateItemFragment = new CertificateItemFragment(item);
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.nav_host_fragment, certificateItemFragment).addToBackStack(null);
    fragmentTransaction.commit();

在正常情况下,导航项目列表菜单打开片段,它们相互替换,但是当我们在任何项目内部移动时,就像您的情况一样,从片段 A 移动到 B, 在这种情况下,通常我们使用另一个 activity 来创建片段。

如果你不想使用activity那么,你只需要添加片段。

尝试以下可能对您有帮助的代码

CertificateItemFragment certificateItemFragment = new CertificateItemFragment(item);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.nav_host_fragment, certificateItemFragment).addToBackStack(CertificateItemFragment.TAG);
fragmentTransaction.commit();

在使用 FragmentManager 之前,您需要了解一些前提。

  1. Activity中有FragmentManager,我们应该用getSupportFragmentManager()调用它,getFragmentManager()已弃用。

  2. Fragment中有多个FragmentManagers称为ParentFragmentManagerChildFragmentManager,最后的FragmentManager这也被弃用了。 ParentFragmentManager 将与 Activity 的 FragmentManager

    相同
  3. getActivity().onBackPressed() 如果 Activity 的 FragmentManager

    中存在任何堆栈,则将拉出片段
  4. fragmentManager.popBackStack() 如果 Activity 或 Fragment 的 中存在任何堆栈,将拉出片段 FragmentManager 依赖于谁调用


基于以上几点

(1)如果你想在Activity中持有片段,你应该在Activity中调用getSupportFragmentManager(),并调用getParentManager() in Fragment, 然后onBackPressed() 将拉出你最后添加到堆栈的片段。

(2)如果你想把fragment放在一个Fragment中,和Activity分开,你应该在Fragment中调用getChildFragmentManager(),然后activity.onBackPressed()会拉出其中的fragment Activity 的片段堆栈并忽略 Fragment 的片段堆栈中的其他片段。


问题与案例(1)相同,如果您不想重新创建片段,则应使用 add() 而不是 replace()

片段 A

CertificateItemFragment certificateItemFragment = new CertificateItemFragment(item);
FragmentManager fragmentManager = getParentFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.nav_host_fragment, certificateItemFragment).addToBackStack(CertificateItemFragment.TAG);
fragmentTransaction.commit();

现在 onBackPressed() 将从 CertificateItemFragment 退回到 Pre-Fragment