vista studio rotación rotacion reinicie que pantalla orientacion movil manejando horizontal girar fijar evitar detectar como cambio cambiar activity android android-fragments android-actionbar actionbarsherlock screen-orientation

android - studio - Obtenga el fragmento actual y guárdelo en el método onSaveInstanceState() para la orientación de la pantalla



rotacion de pantalla android studio (1)

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

Mi problema es cuando voy a rotar la pantalla (que es vertical a horizontal / viceversa), se volverá a llamar a mi actividad para que reinicie mi actividad.

No quiero reiniciar mi actividad, solo restaurar el fragmento actual que se mostró antes de rotarlo. POR FAVOR, no responda a android:configChanges="orientation|keyboardHidden" ya que no resuelve el problema, sino que simplemente lo android:configChanges="orientation|keyboardHidden" . Mi solución fueron los métodos OnsaveInstanceState y onRestoreInstanceState, pero no sé cómo usarlo con mi problema. Por favor ayudame 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 después de una rotación de dispositivo por defecto si no los agrega nuevamente. Si desea que los fragmentos se vean iguales, debe ejecutar onSaveInstanceState en el Fragment . 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 anula onSaveInstanceState en la actividad, el parámetro savedInstanceState seguirá siendo no nulo al restaurar una Activity . Solo será un Bundle vacío.

Otra opción sería almacenar el índice de pestañas seleccionado y volver a seleccionar esa pestaña cuando se restaure su 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 su fragmento no se guarda. Para guardar el estado del fragmento, tendría que hacer algo como la primera solución.