您需要为碎片(Fragment)设置一个唯一的标记(tag),并检查该碎片是否已经添加到您的 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
是否为空并不是一种安全的方法来检查您的碎片是否已设置 - 在大多数情况下它可以工作,但在某些情况下(例如设备内存较低时),Android 可能会销毁您的 Activity,这可能会破坏您的应用程序。
要查看此操作,请在设备的开发选项中勾选“不保留活动”(该设置在 Android 4.0+ 中可用,早期版本不确定)。当您打开新活动时,您的第一个活动将被销毁。当您返回它(通过按下返回键)时,它将再次创建,并且 savedInstanceState 不为 null。但是,您的碎片不再位于活动中,因此您必须重新添加它。
编辑 - 使用 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)
{
mHomeFragment = new FragmentHome();
fragmentManager.beginTransaction()
.add(R.id.fragment_container, mHomeFragment, TAG)
.commit();
}
else
{
mHomeFragment = (FragmentHome)fragment;
}
}
}
如果您想在旋转设备后操纵片段(在本例中为mHomeFragment
),则这非常有用。
setRetainInstance(true)
。不要将此与 Android 自动重新附加片段混淆,它们并不是同一件事。请参考S.D. 在这个答案中报告的跟踪信息。 - Rafa Viotti