フラグメントに一意のタグを付け、このフラグメントがすでにアクティビティに追加されているかどうかを確認する必要があります。
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();
}
}
nullかどうかsavedInstanceState
を確認することは、フラグメントがすでに設定されているかどうかを確認する安全な方法ではありません-ほとんどの場合は機能しますが、場合によっては(デバイスのメモリが少ない場合など)、Androidがアクティビティを強制終了する可能性があります。あなたの申請。
これが実際に動作していることを確認するには、デバイスの開発オプションで[アクティビティを保持しない]にチェックマークを付けます(この設定は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)
{
// 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
これは、デバイスを回転させた後にフラグメント(この場合)を操作する場合に特に便利です。