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.