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 之前,您需要了解一些前提。
在Activity
中有FragmentManager,我们应该用getSupportFragmentManager()
调用它,getFragmentManager()
已弃用。
在Fragment
中有多个FragmentManagers称为ParentFragmentManager
和ChildFragmentManager
,最后的FragmentManager
这也被弃用了。 ParentFragmentManager
将与 Activity 的 FragmentManager
相同
getActivity().onBackPressed()
如果 Activity 的 FragmentManager
中存在任何堆栈,则将拉出片段
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
我有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 之前,您需要了解一些前提。
在
Activity
中有FragmentManager,我们应该用getSupportFragmentManager()
调用它,getFragmentManager()
已弃用。在
相同Fragment
中有多个FragmentManagers称为ParentFragmentManager
和ChildFragmentManager
,最后的FragmentManager
这也被弃用了。ParentFragmentManager
将与 Activity 的 FragmentManager
中存在任何堆栈,则将拉出片段getActivity().onBackPressed()
如果 Activity 的 FragmentManagerfragmentManager.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