![](/img/trans.png)
[英]Fragment methods: attach(), detach(), remove(), replace(), popBackStack()
[英]Attach/detach vs replace fragment
在下面的代碼中,使用detach
/ attach
片段而不是僅僅replacing
它們有什么意義?
private void showFragment(String tag) {
String oldTag = mSelectedTag;
mSelectedTag = tag;
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
final Fragment oldFragment = fm.findFragmentByTag(oldTag);
final Fragment fragment = fm.findFragmentByTag(tag);
if (oldFragment != null && !tag.equals(oldTag)) {
ft.detach(oldFragment);
}
if (fragment == null) {
ft.replace(R.id.container, getContentFragment(tag), tag);
} else {
if (fragment.isDetached()) {
ft.attach(fragment);
}
}
ft.commit();
}
為什么我不能只寫這樣的東西?
private void showFragment(String tag) {
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, getContentFragment(tag), tag);
ft.addToBackStack(null);
ft.commit();
}
getContentFragment
方法,以防萬一:
private Fragment getContentFragment(String tag) {
Fragment fragment = null;
if (Frag1.TAG.equals(tag)) {
fragment = new Frag1();
} else if (Frag2.TAG.equals(tag)) {
fragment = new Frag2();
}
return fragment;
}
這是FragmentTransaction.detach()
的文檔(添加了重點):
從UI分離給定的片段。 此狀態與將其放回堆棧時的狀態相同:片段已從UI中刪除,但是其狀態仍由片段管理器主動管理 。 進入此狀態時,其視圖層次結構被破壞。
因此,一個分離的片段仍在FragmentManager
“活動”; 它的視圖已被破壞,但其所有邏輯狀態均被保留。 因此,當您調用attach()
,您將獲得相同的片段。
但是,傳遞new
片段的FragmentTransaction.replace()
將使您最終使用同一片段類的兩個不同實例,而不是重用單個實例。
就個人而言,我從來不需要使用detach()
和attach()
,並且始終使用replace()
。 但這並不意味着沒有地方和時間對他們有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.