簡體   English   中英

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

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

  1. Activity中有FragmentManager ,我們應該用getSupportFragmentManager()調用它,不推薦使用getFragmentManager()

  2. Fragment中有多個 FragmentManager稱為ParentFragmentManagerChildFragmentManager ,最終的FragmentManager也已被棄用。 並且ParentFragmentManager將與Activity 的 FragmentManager相同

  3. 如果Activity 的 FragmentManager中存在任何堆棧, getActivity().onBackPressed()將拉出片段

  4. 如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM