附加/分离vs替换片段

时间:2017-09-15 19:15:30

标签: 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();
}

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

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;
 }

1 个答案:

答案 0 :(得分:3)

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

  

从UI中分离给定的片段。这与放在后台堆栈时的状态相同:片段从UI中删除,但片段管理器仍在主动管理其状态。进入此状态时,其视图层次结构将被销毁。

所以分离的片段仍然是#34; alive"在FragmentManager内;它的视图已经被破坏但是它的所有逻辑状态都被保留了下来。因此,当您致电attach()时,您将获得相同的片段。

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

就我个人而言,我从未需要使用detach()attach(),而且始终使用replace()。但这并不意味着没有一个地方和时间可以使它们发挥作用。