我有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();
答案 0 :(得分:2)
在使用FragmentManager之前,您需要了解一些前提。
在Activity
中有 FragmentManager ,我们应该用getSupportFragmentManager()
来调用它,getFragmentManager()
已弃用。
在Fragment
中有多个FragmentManagers ,分别称为ParentFragmentManager
和ChildFragmentManager
,最后一个FragmentManager
也已弃用。并且ParentFragmentManager
与活动的FragmentManager
getActivity().onBackPressed()
将提取片段
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();