Debe darle a su Fragmento una etiqueta única y verificar si este Fragmento ya está agregado a su Actividad o no.
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();
}
}
comprobar si savedInstanceState
es nulo no es una manera segura de comprobar si el fragmento ya está establecido - que funcionará en la mayoría de los casos, pero en algunos casos (por ejemplo, cuando el dispositivo está en la memoria baja), Android puede matar su actividad, lo que podría romper su aplicación.
Para ver esto en acción, marque "No guardar actividades" en las opciones de desarrollo del dispositivo (la configuración está disponible en Android 4.0+, no estoy seguro acerca de las versiones anteriores). Cuando abre una nueva actividad, su primera actividad se destruye. Cuando regresa (al presionar hacia atrás), se crea de nuevo y savedInstanceState es no nulo. Sin embargo, su fragmento ya no está en la actividad y debe agregarlo nuevamente.
EDITAR - Mostrando el principio original pero con 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;
}
}
}
Esto viene especialmente útil si se quiere manipular el fragmento (en este caso mHomeFragment
) después de girar el dispositivo
¿Qué debo hacer en caso de que utilice un actividad con ViewPager que maneja los fragmentos? –
@androiddeveloper pray. No seriamente lo que hice fue: super.onCreate (null); – Warpzit
"De forma predeterminada, Android retendrá los objetos de fragmento" ... no es cierto. Android creará nuevos objetos en los cambios de orientación, a menos que se llame a 'setRetainInstance (true)'. No confundas esto con Android volviendo a conectar fragmentos automáticamente. No són la misma cosa. Verifique los rastros informados por S.D. en [esta respuesta] (http://stackoverflow.com/a/12641575/2619107). – Rafa