簡體   English   中英

如何避免片段娛樂?

[英]How to avoid Fragment recreation?

我有2個Fragments F1F2 我使用以下代碼從Activity打開第一個Fragment F1

MyFragment f1 = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString("GameLevelType", "Learn");
dialog.setArguments(bundle);
FragmentTransaction gameTransaction = getSupportFragmentManager().beginTransaction();
gameTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
gameTransaction.add(android.R.id.content, f1).addToBackStack(null).commit();

然后從Fragment F1我使用下面的代碼打開另一個Fragment F2

MySecondFragment f2 = new MySecondFragment();
            Bundle bundle = new Bundle();
            FragmentTransaction transaction = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
            bundle.putInt("CurrentPosition", getAdapterPosition());
            bundle.putIntArray("x", kolamTracingGameList.get(getAdapterPosition()).getX());
            bundle.putIntArray("y", kolamTracingGameList.get(getAdapterPosition()).getY());
            bundle.putInt("Level", (getAdapterPosition() + 1));
            bundle.putString("GameType", "Kolam");
            fragment.setArguments(bundle);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            transaction.replace(android.R.id.content, f2).addToBackStack(null).commit();

問題是當我關閉Fragment F2並且Fragment F1到達前景時。 整個F1正在重新創建(再次調用onViewCreated() )。 我不希望F1在前景方面再次重新創建。

對於第二個片段,使用add而不是replace。

replace - 刪除現有片段並添加一個新片段。當片段F2中按下后退按鈕時,再次調用oncreateView中的片段。

add -retains現有片段並添加一個新片段,這意味着現有片段將處於活動狀態,並且它們不會處於'暫停'狀態。當片段F2中按下后退按鈕時,片段F1的所有方法都不會被再次調用。

transaction.add(android.R.id.content, f2).addToBackStack(null).commit();

如果您希望片段保持其狀態並且不通過onCreateView ,則無法替換它。 讓我們來看看Fragment的生命周期:

當您在片段上調用replace時,您基本上是告訴容器刪除所有當前片段,並添加一個新片段。 如果你刪除一個片段, onPause()將一直被調用,直到onViewDestroyed() ,這意味着如果你得到片段實例並將其添加到容器中,它就沒有View,所以onCreateView()將被調用。

如果你在Fragment2上調用add,它將是可見片段,但Fragment1仍然在容器中。 現在,一旦刪除Fragment2(backPress或以編程方式),Fragment1將在不調用onCreateView()或任何其他狀態的情況下變為可見。

碼:

替換這個:

transaction.replace(android.R.id.content, f2).addToBackStack(null).commit();

附:

transaction.add(android.R.id.content, f2).addToBackStack(null).commit();

每次執行FragmentTransaction之前,您都要創建一個新的FragmentF1F2 你有幾個選擇:

  1. 在創建F1/F2保持對F1/F2的全局引用。 因此,如果它們為null則只創建一個新的。
  2. 或者,如果您不想保留全局參考,請為F1/F2指定唯一標記。 這樣你就可以調用FragmentManager.findFragmentByTag() ,如果它仍然存在,它將返回Fragment 然后你做你的交易。

選項2的示例:

FragmentManager supportFragmentManager = getSupportFragmentManager();
MyFragment f1 = supportFragmentManager.findFragmentByTag("f1_fragment");

if (f1 != null) f1 = new MyFragment();

FragmentTransaction gameTransaction = supportFragmentManager.beginTransaction();
       gameTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
gameTransaction.replace(android.R.id.content, f1, "f1_fragment")
    .commit();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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