簡體   English   中英

附加/分離與替換片段

[英]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.

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