Android通过popBackStack返回上一个片段

时间:2020-07-02 03:31:14

标签: android android-fragments onbackpressed

我有3个片段:Home,A和B。Home和A在移动导航菜单中。

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

但是如果我使用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();

2 个答案:

答案 0 :(得分:2)

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

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

  2. Fragment中有多个FragmentManagers ,分别称为ParentFragmentManagerChildFragmentManager,最后一个FragmentManager也已弃用。并且ParentFragmentManager活动的FragmentManager

  3. 如果活动的FragmentManager中存在任何堆栈,
  4. getActivity().onBackPressed()将提取片段

  5. 如果 Activity或Fragment的 FragmentManager依靠谁调用

    中存在,则
  6. fragmentManager.popBackStack()将提取片段


基于以上几点

(1)如果要在Activity中保留片段,则应在活动中呼叫getSupportFragmentManager(),并在 Fragment < / strong>,然后getParentManager()将提取您上次添加到堆栈中的片段。

(2)如果要将片段保留在片段中并与Activity分开,则应在Fragment中调用onBackPressed(),然后getChildFragmentManager()会取出Activity片段堆栈中的片段,而忽略其他片段片段的片段堆栈中的片段。


问题将与情况(1)相同,并且如果您不想重新创建片段,则应使用activity.onBackPressed()而不是add()

在片段A中

replace()

现在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(); 将从 CertificateItemFragment 后退到 Pre-Fragment

答案 1 :(得分:1)

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

如果您不想使用活动,则只需添加片段。

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

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();