[英]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();
在使用 FragmentManager 之前,您需要了解一些前提。
在Activity
中有FragmentManager ,我們應該用getSupportFragmentManager()
調用它,不推薦使用getFragmentManager()
。
在Fragment
中有多個 FragmentManager稱為ParentFragmentManager
和ChildFragmentManager
,最終的FragmentManager
也已被棄用。 並且ParentFragmentManager
將與Activity 的 FragmentManager相同
如果Activity 的 FragmentManager中存在任何堆棧, getActivity().onBackPressed()
將拉出片段
如果Activity 或 Fragment 的FragmentManager 中存在任何堆棧, fragmentManager.popBackStack()
將拉出 Fragment 依賴於誰調用
基於以上幾點
(1) 如果你想在Activity
中保存 Fragment,你應該在Activity中調用getSupportFragmentManager()
,在Fragment中調用getParentManager()
,然后onBackPressed()
會拉出你最后添加到堆棧的 Fragment。
(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
在正常情況下,導航項目列表菜單打開的片段相互替換,但是當我們在任何項目內部移動時,就像您的情況一樣,從片段 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.