2011-11-27 3 views
5

ho notato che quando si utilizza un FragmentPagerAdapter Frammenti che non sono adiacenti a quella corrente vengono avendo loro osservazioni distrutte (e loro onPause() e onStop() metodi chiamati, e stranamente onSaveInstanceState(Bundle) non viene chiamato), e onCreateView viene chiamato di nuovo per questi frammenti. Il mio problema è che ho alcuni Timer s in esecuzione su questi frammenti e ricrearli non è fattibile perché questi timer dovrebbero attivare e aggiornare l'interfaccia utente del frammento pertinente. Per gli schermi di grandi dimensioni ho utilizzato uno HorizontalScrollView con un LinearLayout e funziona perfettamente.FragmentPagerAdapter - evitare ricreazione di visite frammenti

Il codice in questione nella mia attività:

private class MyPagerAdapter extends FragmentPagerAdapter implements TitleProvider { 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     if (position == 0) { 
      return mAddNewScenesFragment; 
     } else if (position == 1) { 
      return mGlobalEventsFragment; 
     } else { 
      return mSceneFragments.get(position - 2); 
     } 
    } 

    @Override 
    public int getCount() { 
     return mSceneFragments.size() + 2; 
    } 

    @Override 
    public String getTitle(int position) { 
     if (position == 0) { 
      return "New scene"; 
     } else if (position == 1) { 
      return mGlobalEventsFragment.getTitle(); 
     } else { 
      return mSceneFragments.get(position - 2).getTitle(); 
     } 
    } 
} 

I frammenti vengono creati sul metodo della attività onCreate e altri possono essere aggiunti alla lista in fase di esecuzione, ma anche senza l'aggiunta di nuovi, il terzo frammento è distrutta quando passo al primo.

C'è un modo per evitare la loro distruzione o dovrei semplicemente dimenticarmi di ViewPager e usare uno HorizontalScrollView anche per schermi piccoli? Ho scelto di usarlo perché penso che il comportamento "fisso" aiuti davvero con l'usabilità.

risposta

16

Il seguente metodo dovrebbe impedire i frammenti di distruggere:

mViewPager.setOffscreenPageLimit(no_of_fragments_to_be_kept_offscreen); 
+4

Non è mFragmentPagerAdapter.setOffscreenPageLimit(). È mViewPager.setOffscreenPageLimit (numberOfFragments). Sono sorpreso che così tanti hanno svalutato l'errore. –

+0

Hai ragione @raychenon. Ho aggiornato la mia risposta. – Saimon

+0

Sì, questo ha risolto il mio problema .. grazie a @Saimon – bebosh

0

Si dovrebbe estendersi da FragmentStatePagerAdapter invece di FragmentPagerAdapter. Il metodo onCreate (Bundle savedInstanceState) non dovrebbe più essere chiamato una seconda volta.

0

È necessario impostare il limite per il cercapersone per evitare di distruggere la vista.

your_pager_obj.setOffscreenPageLimit(no_of_fragments_on_each_side_of_the_current_fragment); 
6

Invece di hacker FragmentPagerAdapter, è sufficiente utilizzare ViewPager.

int limit = myPagerAdapter.getCount(); 
// Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state. 
viewpager.setOffscreenPageLimit(limit);