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à.
Non è mFragmentPagerAdapter.setOffscreenPageLimit(). È mViewPager.setOffscreenPageLimit (numberOfFragments). Sono sorpreso che così tanti hanno svalutato l'errore. –
Hai ragione @raychenon. Ho aggiornato la mia risposta. – Saimon
Sì, questo ha risolto il mio problema .. grazie a @Saimon – bebosh