在下面的代码中,使用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;
}
答案 0 :(得分:3)
这里是FragmentTransaction.detach()
的文档(强调添加):
从UI中分离给定的片段。这与放在后台堆栈时的状态相同:片段从UI中删除,但片段管理器仍在主动管理其状态。进入此状态时,其视图层次结构将被销毁。
所以分离的片段仍然是#34; alive"在FragmentManager
内;它的视图已经被破坏但是它的所有逻辑状态都被保留了下来。因此,当您致电attach()
时,您将获得相同的片段。
FragmentTransaction.replace()
,传递new
片段会导致您使用相同片段类的两个不同实例,而不是重复使用单个实例。
就我个人而言,我从未需要使用detach()
和attach()
,而且始终使用replace()
。但这并不意味着没有一个地方和时间可以使它们发挥作用。