5

estoy usando ActionBarSherlock (que es básicamente una extensión del paquete de soporte de Android).ViewPager + FragmentStatePagerAdapter: ViewPager deja de funcionar cuando cambia la orientación de la pantalla

lo que estoy tratando de hacer es la siguiente:

Tengo un FragmentActivity que alberga un solo ViewPager. Este ViewPager tiene un FragmentStatePagerAdapter (porque habrá muchos artículos en el futuro). Pero por ahora solo está cargado con 2 elementos para probar.

Todo está funcionando bien mientras estoy en orientación vertical. Pero cuando cambio la orientación horizontal, vuelve al primer elemento del adaptador (lo cual está bien ya que todo se vuelve a cargar, etc.), pero no puedo pasar al siguiente elemento. Simplemente no pasa nada.

De la depuración puedo ver que el Loader devuelve los dos artículos muy bien. getItem(...) también se llama con position 0 y 1. Así que todo se ve bien, excepto que no lo es;)

Btw: lo mismo sucede viceversa cuando comienzo en orientación horizontal y cambio a orientación vertical.

¿Alguna idea de lo que podría estar mal aquí?

Aquí es parte de mi código:

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)); 
} 

Respuesta

-2

Trate de añadir android:configChanges="orientation" manifestar etiqueta de actividad en el interior

+0

no cambia el comportamiento ... – Goddchen

+0

En mi proyecto cuando inicializo el host de pestañas comenté la inicialización de pestañas 'protected void onCreate (Bundle savedInstanceState) {this. initialiseTabHost (savedInstanceState); \t \t/* if (savedInstanceState! = Null) { mTabHost.setCurrentTabByTag (savedInstanceState.getString ("tab")); // establece la pestaña según el estado guardado } * /} 'Eso me solucionó los errores de orientación cuando se usa en conjunción con' android: configChanges = "orientation" ' – JackMahoney

12

androide: configChanges = "orientación" funcionó como un encanto, pero vi que no es recomendado por el equipo de Android (solo recurso de último caso) ... Ver aquí http://developer.android.com/guide/topics/manifest/activity-element.html#config

Descubrí que poner: setRetainInstance (verdadero); en el onCreateView de cada fragmento retenido, la instancia hace el truco. (por favor, no se llamará a onActivityCreated otra vez)

+2

setRetainInstance (true); ¡en onCreate es la solución! Gracias – passsy