你需要给你的 Fragment 一个唯一的标签,并检查这个 Fragment 是否已经添加到你的 Activity 中。
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
为 null 不是检查您的片段是否已设置的安全方法 - 它在大多数情况下都可以工作,但在某些情况下(例如当设备内存不足时),Android 可能会杀死您的 Activity,这可能会中断你的申请。
要查看实际情况,请在设备的开发选项中勾选“不保留活动”(该设置在 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;
}
}
}
mHomeFragment
如果您想在旋转设备后操纵片段(在这种情况下),这将特别有用