Tengo un problema con Fragments
y cambio de orientación.Fragmentos que no funcionan correctamente después del cambio de orientación
Tengo una aplicación que tiene un MainActivity
que maneja la conmutación Fragments
a través de una barra de acciones con pestañas. Aquí está el código para la barra de acciones con pestañas y cuando se selecciona una pestaña.
private class MyTabListener <T extends android.support.v4.app.Fragment> implements ActionBar.TabListener {
private android.support.v4.app.Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
public MyTabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
@Override
public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
if (mFragment == null){ // check to see if the fragment has already been initialised. If not create a new one.
mFragment = android.support.v4.app.Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content,mFragment,mTag);
} else {
ft.attach(mFragment); // if the fragment has been initialised attach it to the current activity
}
}
@Override
public void onTabUnselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
if (mFragment != null){
ft.detach(mFragment); // when a fragment is no longer needed, detach it from the activity but dont destroy it
}
}
@Override
public void onTabReselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
}
La forma en que lo veo es que todo funciona bien cuando la aplicación se carga por primera vez en modo retrato. Cuando giro, por alguna razón, se agrega otra instancia de Fragment1
y luego no se desconecta cuando se selecciona otra pestaña. Este también es el caso cuando luego giro de nuevo a retrato.
He intentado usar setRetainInstance(true);
en mi Fragments
pero esto no funciona.
¿Hay algún método que deba anular o hacer algo con mi Fragments
antes de girar?
Gracias de antemano.
EDIT He visto que onTabSelected se vuelve a llamar cuando se recrea la actividad. ¿Podría ser esta la causa de mi problema con los fragmentos adjuntos más de una vez?
Aquí están mis actividades en el método Crear.
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
//setContentView(R.layout.main);
}
// Create the Action Bar with tabs
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);
//create the tab for track and add it to the action bar.
Tab tab = actionBar.newTab()
.setText("Track")
.setTabListener(new MyTabListener<TrackingFragment>(this,"track",TrackingFragment.class));
actionBar.addTab(tab);
//create the tab for ski tracks and add it to the action bar.
tab = actionBar.newTab()
.setText("Something Tracks")
.setTabListener(new MyTabListener<TrackListFragment>(this,"somethingtracks",TrackListFragment.class));
actionBar.addTab(tab);
//create the tab for photos and add it to the action bar.
tab = actionBar.newTab()
.setText("Photos")
.setTabListener(new MyTabListener<PhotoFragment>(this,"photos",PhotoFragment.class));
actionBar.addTab(tab);
Si pongo mi código de barras de acción en el método onCreate, no se crea ni se muestra cuando la actividad se recrea después de un cambio de orientación. Voy a probar la parte supportManager ahora – StuStirling
+1 ... entrando allí con la respuesta correcta mientras editaba. :) – Barak
es el fragmento que no se transfiere cuando llama al setTabListener? – StuStirling