我有以下活动:
class SwitchFragAct extends AppCompatActivity {
Fragment a;
Fragment b;
onClickSwitchFrags(View v) {
FragmentManager mgr = getSupportFragmentManager();
Fragment currentFrag = mgr.findFragmentById(R.id.frag_to_swap);
if (currentFrag == a) {
mgr.beginTransaction().detach(a).attach(b).commit();
} else if (currentFrag == b) {
mgr.beginTransaction().detach(b).attach(a).commit();
}
}
}
因此泄漏金丝雀会抱怨未附加的片段正在泄漏(例如@SwitchFragAct#a)。我有什么办法可以确保它不泄漏?我想我需要使用附加/分离,以便状态仍然被保存。我认为唯一的选择是每次都重新创建片段。目前,在该片段中没有任何机制可以执行此操作,我可以在其中传递保存的状态。
为了防止
SwitchFragAct
类中的片段泄漏,您可以考虑使用 replace
方法而不是 detach
和 attach
。 replace
方法删除当前片段并在其位置添加一个新片段。这可确保前一个片段被正确销毁并避免任何潜在的内存泄漏。
class SwitchFragAct extends AppCompatActivity {
Fragment a;
Fragment b;
onClickSwitchFrags(View v) {
FragmentManager mgr = getSupportFragmentManager();
Fragment currentFrag = mgr.findFragmentById(R.id.frag_to_swap);
if (currentFrag == a) {
mgr.beginTransaction().replace(R.id.frag_to_swap, b).commit();
} else if (currentFrag == b) {
mgr.beginTransaction().replace(R.id.frag_to_swap, a).commit();
}
}
}
在此代码中,
replace
方法用于将当前片段(currentFrag
)替换为所需片段(a
或b
)。通过这样做,前一个片段将被正确销毁,并将新片段添加到其位置,从而避免任何潜在的内存泄漏。
请注意,您需要将
R.id.frag_to_swap
替换为放置片段的容器的实际 ID。