Cambiar fragmentos dentro de la pestaña

Estoy creando una aplicación que utiliza ActionBarSherlock. La aplicación consta de tres pestañas, y en cada una de ellas, se muestran varias pantallas consecutivas basadas en la entrada del usuario. Puedo cambiar los fragmentos entre las lengüetas, pero la conmutación de fragmentos dentro de las lengüetas da un problema. Lo he probado de esta manera:

En la clase principal:

SingleStationFragment singleStationFragment = new SingleStationFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, singleStationFragment); transaction.addToBackStack(null); transaction.commit(); 

Esto sustituye al primer fragmento para el segundo, pero cuando cambio las pestañas, el segundo fragmento sigue visible, mostrando el contenido de la nueva pestaña encima del contenido de la pestaña antigua. Creo que de alguna manera necesito separar el segundo fragmento en onTabUnselected , pero no tengo idea de cómo obtener una referencia a este Fragmento.

Puede alguien ayudarme con esto?

Para mayor claridad, algunas clases significativas:

Mi clase principal:

 public class TreinVerkeer extends SherlockFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupTabs(savedInstanceState); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } private void setupTabs(Bundle savedInstanceState) { ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); Tab tab = actionBar.newTab().setText("STATIONS").setTabListener(new TabListener<StationsFragment>(this, "stations", StationsFragment.class)); actionBar.addTab(tab); tab = actionBar.newTab().setText("ROUTE").setTabListener(new TabListener<RouteFragment>(this, "route", RouteFragment.class)); actionBar.addTab(tab); tab = actionBar.newTab().setText("DELAYS").setTabListener(new TabListener<DelaysFragment>(this, "delays", DelaysFragment.class)); actionBar.addTab(tab); if (savedInstanceState != null) { actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); } } 

TabListener (desde "Agregar pestañas de navegación" en el sitio de desarrolladores de Android con algunos cambios menores):

 public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { private SherlockFragment mFragment; private final Activity mActivity; private final String mTag; private final Class<T> mClass; /** * Constructor used each time a new tab is created. * * @param activity * The host Activity, used to instantiate the fragment * @param tag * The identifier tag for the fragment * @param clz * The fragment's Class, used to instantiate the fragment */ public TabListener(Activity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } /* The following are each of the ActionBar.TabListener callbacks */ public void onTabSelected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); // Check if the fragment is already initialized if (mFragment == null && preInitializedFragment == null) { // If not, instantiate and add it to the activity mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content, mFragment, mTag); } else if (mFragment != null) { // If it exists, simply attach it in order to show it ft.attach(mFragment); } else if (preInitializedFragment != null) { ft.attach(preInitializedFragment); mFragment = preInitializedFragment; } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (mFragment != null) { // Detach the fragment, because another one is being attached ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { // User selected the already selected tab. Usually do nothing. } } 

Y StationsFragment ( RouteFragment y DelaysFragment son iguales, con solo texto diferente)

 public class StationsFragment extends SherlockFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.stationsfragment, container, false); } } 

Así que lo que sucedió fue que, en TabListener , en el método onTabUnselected , el Fragment no se desprendió, haciendo que siguiera siendo mostrar mientras se mostraba un nuevo Fragment .

La causa de esto fue que el Fragment que fue desprendido fue el primer fragmento, y no mi segundo fragmento. He hecho algunos cambios.

En la Activity :

 SingleStationFragment singleStationFragment = new SingleStationFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(android.R.id.content, singleStationFragment, "STATIONS"); transaction.addToBackStack(null); transaction.commit(); 

Aquí he añadido la etiqueta "STATIONS" en el método replace() , que es la misma etiqueta que el primer fragmento.
El TabListener ahora es como sigue:

 public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { private final SherlockFragmentActivity mActivity; private final String mTag; private final Class<T> mClass; private SherlockFragment mFragment; public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } public void onTabSelected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (preInitializedFragment == null) { mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); ft.add(R.id.treinverkeer_fragmentcontent, mFragment, mTag); } else { ft.attach(preInitializedFragment); } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); if (preInitializedFragment != null) { ft.detach(preInitializedFragment); } else if (mFragment != null) { ft.detach(mFragment); } } public void onTabReselected(Tab tab, FragmentTransaction ft) { // User selected the already selected tab. Usually do nothing. } } 

En el método onTabUnselected primero recupero el Fragment correcto, luego lo desacoplé.

Espero que esto ayude a alguien!

  • Java.lang.OutOfMemoryError en Android 4.0 (API 14)
  • Android 2.1 NullPointerException con TabWidgets
  • PagerTabStrip: cambia el ancho de la pestaña
  • Cómo hacer scrollable tab en Android?
  • Menú diferente para diferentes pestañas en la pestaña + aplicación de desplazamiento para el proyecto android
  • Android: "Tipo de navegación: Fijaciones fijas + Golpe"
  • Utilice diferentes colores para diferentes ActionBar.Tab
  • Obtener una URL de pestaña desde la acción de la página (WebExtensions, Android)
  • Ficha que no toma el ancho completo en el dispositivo Tablet
  • Las pestañas de la barra de acción no llenan la pantalla en android
  • Cerrar el teclado virtual después de cambiar las pestañas en tabhost
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.