【问题标题】:Android Back to previous fragment by popBackStackAndroid 通过 popBackStack 返回上一个片段
【发布时间】:2020-07-02 03:31:14
【问题描述】:

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

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

但如果我使用getActivity().onBackPressed();,它会转到主页片段而不是 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();

【问题讨论】:

标签: android android-fragments onbackpressed


【解决方案1】:

在使用 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中保存fragment,你应该在Activity中调用getSupportFragmentManager(),在Fragment中调用getParentManager(),然后@ 987654334@ 将拉出你上次添加到堆栈的片段。

(2) 如果你想在一个Fragment中保存Fragment并与Activity分离,你应该在Fragment中调用getChildFragmentManager(),然后activity.onBackPressed()会拉出Activity的Fragment栈中的Fragment,而忽略Fragment的Fragment中的其他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

【讨论】:

    【解决方案2】:

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

    如果你不想使用activity,那么你只需要添加fragment即可。

    试试下面可能对你有帮助的代码

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

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 2020-06-08
      • 2015-04-06
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      相关资源
      最近更新 更多