[英]How to avoid Fragment recreation?
我有2個Fragments
F1和F2 。 我使用以下代碼從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
之前,您都要創建一個新的Fragment
, F1
或F2
。 你有幾個選擇:
F1/F2
保持對F1/F2
的全局引用。 因此,如果它們為null
則只創建一個新的。 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.