Obtener fragmento actual y guardar en onSaveInstanceState () Método para la orientación de pantalla

Tengo una Actividad con múltiples Fragmentos. También estoy usando actionbarSherlock para mis pestañas que también se conectan a fragmentos.

Mi problema es cuando voy a girar la pantalla (que es de retrato a paisaje / viceversa), mi actividad se llamará de nuevo para que se reinicie mi actividad.

No quiero reiniciar mi actividad, sino restaurar el fragmento actual que se mostró antes de que fuera rotación. POR FAVOR, no responda android:configChanges="orientation|keyboardHidden" ya que no resuelve el problema, sino como un simple hack. Mi solución fue el OnsaveInstanceState y onRestoreInstanceState Métodos, pero no sé cómo usarlo con mi problema. Por favor, ayúdame con esto. Cualquier respuesta es muy apreciada.

CÓDIGO:

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tabA = actionBar.newTab().setIcon(R.drawable.about); ActionBar.Tab tabE = actionBar.newTab().setIcon(R.drawable.faq); ActionBar.Tab tabB = actionBar.newTab().setIcon(R.drawable.sponsors); ActionBar.Tab tabC = actionBar.newTab().setIcon(R.drawable.map); ActionBar.Tab tabD = actionBar.newTab().setIcon(R.drawable.destination); Fragment aboutTab = new PhotosActivity(); Fragment sponsorTab = new SongsActivity(); Fragment mapTab = new HCCMapActivity(); Fragment questTab = new FaqActivity(); Fragment DestinationTab = new TourActivity(); tabA.setTabListener(new MyTabsListener(aboutTab)); tabB.setTabListener(new MyTabsListener(sponsorTab)); tabC.setTabListener(new MyTabsListener(mapTab)); tabD.setTabListener(new MyTabsListener(DestinationTab)); tabE.setTabListener(new MyTabsListener(questTab)); actionBar.addTab(tabD, 0, true); actionBar.addTab(tabC, 1, false); actionBar.addTab(tabA, 2, false); actionBar.addTab(tabB, 3, false); actionBar.addTab(tabE, 4, false); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); // Save UI state changes to the savedInstanceState. // This bundle will be passed to onCreate if the process is // killed and restarted. savedInstanceState.putString("MyString", "Welcome back to Android"); //savedInstanceState.putString("id",) // etc. //getSupportFragmentManager().putFragment(savedInstanceState, "fragment", getSupportFragmentManager().findFragmentById(R.id.fragment_place)); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { FragmentManager fragmentManager ; FragmentTransaction ft ; super.onRestoreInstanceState(savedInstanceState); // Restore UI state from the savedInstanceState. // This bundle has also been passed to onCreate. String myString = savedInstanceState.getString("MyString"); Log.i("Hello", myString); fragmentManager = getSupportFragmentManager(); ft = fragmentManager.beginTransaction(); ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right); ft.replace(R.id.fragment_place, getSupportFragmentManager().getFragment(savedInstanceState, "fragment"), null); } @Override public void onConfigurationChanged (Configuration newConfig){ Log.i("hello", "Config"); super.onConfigurationChanged(newConfig); } @Override public boolean onPrepareOptionsMenu (Menu menu) { //MenuItem menuitem1 = menu.findItem(R.id.menuitem1); //menuitem1.setVisible(false); menu.getItem(1).setVisible(false); menu.getItem(0).setVisible(false); return true; } protected class MyTabsListener implements TabListener{ Fragment fragment; public MyTabsListener(Fragment fragment){ this.fragment = fragment; } public void onTabSelected(Tab tab, FragmentTransaction ft) { if (myTabPosition < 0){ //ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); }else{ if (myTabPosition > tab.getPosition()){ ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); }else{ ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right); } } myTabPosition = tab.getPosition(); ft.replace(R.id.fragment_place, fragment, null); //ft.commit(); } public void onTabUnselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub ft.remove(fragment); getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } public void onTabReselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } } 

Los fragmentos se restaurarán de forma predeterminada después de una rotación del dispositivo si no los vuelve a agregar. Si desea que los fragmentos se vean iguales, entonces debe realizar su onSaveInstanceState en el Fragment sí. En la Activity puedes hacer algo como:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(savedInstanceState == null) { /* First launch, add fragments */ } else { /* Activity restored, don't add new fragments or in your case, don't make the first tab selected. */ } } 

Incluso si no invalida onSaveInstanceState en la actividad, el parámetro savedInstanceState seguirá siendo no nulo al restaurar una Activity . Sólo será un Bundle vacío.

Otra opción sería almacenar el índice de la ficha seleccionada y volver a seleccionar esa pestaña cuando se restaure la actividad.

 @Override public void onSaveInstanceState(Bundle outState) { outState.putInt("CurrentTab", currentTabIndex); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* Your existing code */ if(savedInstanceState != null) { int currentTab = savedInstanceState.getInt("CurrentTab", 0); /* Set currently selected tab */ } } 

Esto volvería a seleccionar la pestaña actual y mostrar el Fragment que se estaba mostrando. El único inconveniente de esto es que el estado de tu fragmento no se guarda. Para guardar el estado del fragmento, tendrías que hacer algo como la primera solución.

  • Forzar cierre en modo horizontal, pero no en vertical
  • Mi aplicación Android gira aunque la rotación de la pantalla esté desactivada en el sistema operativo. ¿Cómo puedo arreglar esto?
  • Cómo evitar que las vistas personalizadas pierdan estado a través de los cambios de orientación de la pantalla
  • ¿Por qué la orientación del emulador de pan de jengibre se atascan en las aplicaciones?
  • Vista previa de paisaje de la disposición de xml de androide en Eclipse
  • Fragmentos restauran el estado en la orientación cambiada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.