2013-01-04 12 views
5

Ho uno ViewPager con 4 schede.Frammento ricreato quando si cambia scheda con ViewPager

Sto usando un adattatore personalizzato che estende FragmentPagerAdapter.

Il problema è che quando cambio la scheda, il primo Fragment viene creato di nuovo anche se non è attualmente visibile. Inoltre, questo accade solo dopo aver cambiato la scheda per la quarta volta. Per esempio. tab1 -> tab2 -> tab3 =>onStop da tab1 viene chiamato. -> tab2 =>onCreateView da tab1 viene chiamato (onAttach non viene chiamato).

Voglio evitare questo. Ho bisogno che tutte le schede rimangano sempre nel loro stato anche quando non sono attualmente visualizzate. Come posso fare questo?

risposta

0

Quando si crea un'istanza del frammento, chiamare setRetainInstance(true). Ciò manterrà lo stato di istanza del frammento. Sarà ancora chiamato il numero onCreateView e sarà necessario assicurarsi di utilizzare lo stato salvato e di eseguire il rendering delle viste senza caricare nuovamente alcun dato, ad es. utilizzando un boolean per rappresentare se il tuo frammento è già stato inizializzato.

Si potrebbe fare qualcosa di simile:

public static class MyAdapter extends FragmentPagerAdapter { 
     @Override 
     public Fragment getItem(int position) { 
       MyFragment myFragment = new MyFragment(); 
       myFragment.setRetainInstance(true); 
       return myFragment; 
     } 
} 

class MyFragment extends Fragment { 
     . 
     . 
     . 

     boolean initialized = false; 
     ArrayList<MyData> myData = null; 

     void onCreate(...) { 
       if (initialized) { 
         renderViews(); 
       } else { 
         initialized = true; 
         loadData(); 
         renderViews(); 
       } 
     } 
} 

Non è necessario implementare onSaveInstanceState(). Sarà gestito automaticamente.

+0

non capisco questo comportamento .. Perché è creato di nuovo dopo essere stato coltivato a gradini se non è nemmeno quello visualizzato? Tuttavia, sto cercando di seguire il tuo approccio, ma non riesco a capire come salvare lo stato. Ho aggiunto 'setRetainInstance (true)' in 'onCreateView()' da 'Fragment' ma' onSaveInstanceState() 'non viene mai chiamato. – sergi

+0

Viene richiamato di nuovo perché crea un frammento a sinistra ea destra della vista corrente in modo che possa visualizzarlo con animazione scorrevole. Vedi la mia modifica per maggiori dettagli. –

+0

ora è più chiaro, ma non faccio nulla con le viste in 'onCreate()' ma in 'onCreateView()' che deve restituire un 'View' che dovrà essere modificato per corrispondere allo stato precedente. Infatti, quando uso 'myFragment.setRetainInstance (true);' il 'onCreateView()' o 'onCreate()' non viene chiamato quando era in precedenza. – sergi

Problemi correlati