8

Ho un'attività con più frammenti. Sto anche usando actionbarSherlock per le mie schede che sono anche collegate ai frammenti.Ottieni frammento corrente e salvataggio su onSaveInstanceState() Metodo per l'orientamento dello schermo

Il mio problema è quando ho intenzione di ruotare lo schermo (da verticale a orizzontale/viceversa), la mia attività verrà richiamata in modo da riavviare la mia attività.

Desidero non riavviare la mia attività ma solo ripristinare il frammento corrente che è stato mostrato prima che fosse ruotato. PER FAVORE non rispondere android:configChanges="orientation|keyboardHidden" dal momento che non ha risolto il problema ma proprio come un semplice hack di esso. La mia soluzione era i metodi OnsaveInstanceState e onRestoreInstanceState ma non so come usarlo con il mio problema. Per favore aiutami con questo. Ogni risposta è molto apprezzata.

CODICE:

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 

    } 
} 

risposta

13

frammenti verranno ripristinati dopo una rotazione del dispositivo di default se non si aggiunge di nuovo. Se si desidera che i frammenti abbiano lo stesso aspetto, è necessario eseguire lo onSaveInstanceState nello stesso Fragment. Nella Activity si può solo fare qualcosa di simile:

@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. 
     */ 
    } 
} 

Anche se non ignorare onSaveInstanceState nell'attività, il parametro savedInstanceState sarà ancora non nulla durante il ripristino di un Activity. Sarà solo un Bundle vuoto.

Un'altra opzione potrebbe essere quella di memorizzare l'indice di tabulazione selezionato e di selezionare nuovamente tale scheda al ripristino dell'attività.

@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 */ 
    } 
} 

Ciò riselezionare la scheda corrente e mostra Fragment che veniva mostrato. L'unico svantaggio di questo è che lo stato del tuo frammento non viene salvato. Per salvare lo stato del frammento, dovresti fare qualcosa come la prima soluzione.

+0

Come posso salvare lo stato del mio frammento? –

+0

Invece di 'actionBar.addTab (tabD, 0, true);' fai questo: 'if (savedInstanceState == null) {actionBar.addTab (tabD, 0, true);} else {actionBar.addTab (tabD, 0, false); } 'Ciò dovrebbe consentire il ripristino del frammento esistente. L'indicatore di tabulazione potrebbe essere spento, quindi dovresti impostare quale è indicato. – MCeley

Problemi correlati