5

sto usando ActionBarSherlock (che è sostanzialmente un'estensione del pacchetto di supporto Android).ViewPager + FragmentStatePagerAdapter: ViewPager smette di funzionare quando cambia l'orientamento dello schermo

Quello che sto cercando di fare è la seguente:

Ho un FragmentActivity che ospita una sola ViewPager. Questo ViewPager ha un FragmentStatePagerAdapter (perché ci saranno molti articoli in futuro). Ma per ora è solo carico di 2 oggetti da testare.

Tutto funziona perfettamente mentre sono in orientamento verticale. Ma quando cambio l'orientamento orizzontale, torno al primo elemento nell'adattatore (che va bene dato che tutto viene ricaricato ecc.), Ma non riesco a scriverlo sul prossimo oggetto. Non sta succedendo nulla.

Da debug, posso vedere che lo Loader restituisce i due elementi correttamente. getItem(...) viene anche chiamato con position 0 e 1. Quindi tutto sembra tutto a posto, tranne che non lo è;)

A proposito: la stessa cosa sta succedendo viceversa quando inizio in orientamento orizzontale e passa all'orientamento verticale.

Qualche idea di cosa potrebbe esserci di sbagliato qui?

Ecco alcuni del mio codice:

public class QuotesStatePagerAdapter extends FragmentStatePagerAdapter { 

private List<Quote> mQuotes; 

public QuotesStatePagerAdapter(FragmentManager fm, List<Quote> quotes) { 
    super(fm); 
    mQuotes = quotes; 
} 

@Override 
public Fragment getItem(int position) { 
    Bundle arguments = new Bundle(); 
    arguments.putSerializable("quote", mQuotes.get(position)); 
    QuoteFragment fragment = new QuoteFragment(); 
    fragment.setArguments(arguments); 
    return fragment; 
} 

@Override 
public int getCount() { 
    return mQuotes.size(); 
} 

}

public QuotesFragment() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

public void updateOrdering(ORDERING newOrdering) { 
    mOrdering = newOrdering; 
    getLoaderManager().getLoader(0).startLoading(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.quotes, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    mViewPager = (ViewPager) view.findViewById(R.id.viewpager); 
    mViewPager.setOnPageChangeListener(this); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    getLoaderManager().initLoader(0, null, this); 
} 

@Override 
public Loader<List<Quote>> onCreateLoader(int id, Bundle args) { 
    return new QuotesLoader(getActivity(), mCategoryId); 
} 

@Override 
public void onLoadFinished(Loader<List<Quote>> loader, List<Quote> data) { 
    mQuotes = data; 
    mViewPager.setAdapter(new QuotesStatePagerAdapter(
      getSupportFragmentManager(), mQuotes)); 
} 

risposta

-2

Prova ad aggiungere android:configChanges="orientation" manifestare tag all'interno di attività

+0

non modifica il comportamento ... – Goddchen

+0

Nel mio progetto quando inizializzo l'host della scheda ho commentato l'inizializzazione della scheda 'protected void onCreate (Bundle savedInstanceState) {this. initialiseTabHost (savedInstanceState); \t \t/* if (savedInstanceState! = Null) { mTabHost.setCurrentTabByTag (savedInstanceState.getString ("scheda")); // imposta la scheda secondo lo stato salvato } * /} 'Questo risolve gli errori di orientamento per me quando usato in congiunzione con' android: configChanges = "orientation" ' – JackMahoney

12

android: configChanges = "orientamento" ha funzionato come un fascino, ma ho visto che non è raccomandato dal team di Android (solo la risorsa dell'ultimo caso) ... Vedi qui http://developer.android.com/guide/topics/manifest/activity-element.html#config

Ho scoperto che mettendo: setRetainInstance (true); sulla onCreateView di ogni frammento mantenuto l'istanza fa il trucco. (per favore, non che l'onActivityCreated venga richiamato)

+2

setRetainInstance (true); in onCreate è la soluzione! Grazie – passsy