附加/分离与替换片段

Fel*_*lus 3 android android-fragments

在下面的一段代码中,使用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();
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能写这样的东西?

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();
}
Run Code Online (Sandbox Code Playgroud)

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;
 }
Run Code Online (Sandbox Code Playgroud)

Ben*_* P. 5

这是FragmentTransaction.detach()(强调添加)的文档:

从 UI 中分离给定的片段。这与将其放在返回堆栈上时的状态相同:片段已从 UI 中移除,但其状态仍由片段管理器主动管理。当进入这个状态时,它的视图层次结构被破坏。

所以一个分离的片段在FragmentManager; 中仍然“活着” 。它的视图已被破坏,但它的所有逻辑状态都保留了下来。因此,当您调用 时attach(),您会得到相同的片段。

FragmentTransaction.replace()new然而,传递一个片段会导致你使用同一个片段类的两个不同实例,而不是重用单个实例。

就我个人而言,我从来不需要使用detach()and attach(),并且一直使用replace(). 但这并不意味着没有地方和时间它们会派上用场。