你需要给你的片段一个独特的标签,并检查这个片段是否已经添加到你的活动已经或没有。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String tag = "my_fragment";
FragmentManager fragmentManager = getFragmentManager();
if(fragmentManager.findFragmentByTag(tag) == null) {
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
Fragment homeFragment = new Home();
fragmentTransaction.add(R.id.mainFragement, homeFragment, tag);
fragmentTransaction.commit();
}
}
检查savedInstanceState
是否为空是不是要检查你的片段是否已经设置了安全的方式 - 它会在大多数情况下工作,但在某些情况下(例如,当设备处于低内存),安卓可能会导致您的活动中断,这可能会破坏您的应用
要在操作中看到此操作,请在设备的开发选项中勾选“不要保留活动”(该设置在Android 4.0+中可用,不确定早期版本)。当你打开一个新的活动时,你的第一个活动就会被销毁。当您返回时(通过按回),它会再次创建,并且savedInstanceState为而不是为空。但是,您的片段不再处于活动状态,您必须再次添加它。
编辑 - 显示原来的原则,但与SupportFragmentManager
public class ActivityAwesome extends AppCompatActivity
{
private final String TAG = getClass().getSimpleName();
private FragmentHome mHomeFragment;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(TAG);
if(fragment == null)
{
// Create the detail fragment and add it to the activity using a fragment transaction.
mHomeFragment = new FragmentHome();
fragmentManager.beginTransaction()
.add(R.id.fragment_container, mHomeFragment, TAG)
.commit();
}
else
{
// get our old fragment back !
mHomeFragment = (FragmentHome)fragment;
}
}
}
我应该在的情况下我用的与处理碎片的ViewPager活动? – 2012-08-17 22:56:31
@androiddeveloper祈祷。没有认真地做我的是:super.onCreate(null); – Warpzit 2012-11-09 10:53:36
“默认情况下,android会保留片段对象”...不正确。除非调用'setRetainInstance(true)',否则Android将根据方向更改创建新对象。不要将此与Android自动重新连接片段混淆。它们不是同一件事。检查由S.D.报告的痕迹在[这个答案](http://stackoverflow.com/a/12641575/2619107)。 – Rafa 2013-11-14 20:58:38