viewpager - how to use multiple fragments in android
Fragmento en ViewPager usando FragmentPagerAdapter está en blanco la segunda vez que se ve (9)
Tengo una interfaz de fragmento con pestañas en la parte inferior que abren diferentes fragmentos en la vista principal.
Tengo un fragmento particular que es una lista de elementos. Si el usuario selecciona uno de los elementos en esta lista, se abre otro fragmento que contiene un viewpager que se desplaza horizontalmente entre todos los elementos de la lista en el fragmento anterior. Esto funciona genial
El viewpager usa un FragmentPagerAdapter para mostrar los elementos.
El problema surge cuando el usuario selecciona un elemento en la lista, lo ve, luego presiona el botón en la barra de pestañas para volver a la lista y luego selecciona otro elemento. La segunda vez que se selecciona un elemento, aparece una pantalla en blanco en lugar de viewpager. No recibo errores en mi LogCat cuando esto sucede.
¿Por qué el viewpager solo aparece la primera vez?
FragmentPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
Cursor mCursor;
public ViewPagerAdapter(FragmentManager fm, Cursor c) {
super(fm);
mCursor = c;
}
public void changeCursor(Cursor c) {
mCursor = c;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
mCursor.moveToPosition(position);
return TeamCardFragment.newInstance(mCursor, position);
}
}
PagerFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = getArguments();
mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
View mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
new setAdapterTask().execute();
return mView;
}
private class setAdapterTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
mViewPager.setAdapter(mAdapter);
mViewPager.setCurrentItem(mCursorPosition);
}
}
En mi caso particular, donde estaba usando un CoordinatorLayout con un AppBarLayout y ViewPager, lo que me solucionó fue eliminar el android: fitsSystemWindows = "true" de mis propiedades de AppBarLayout xml .
No me preguntes por qué. Sé que suena un poco ridículo y que no debería tener ninguna correlación, pero esta única línea era la única que causaba problemas ya que yo estaba usando getChildFragmentManager () en mi adaptador. Pasé un día entero depurando mi código solo para encontrar esto, así que espero que le ahorre a alguien más algo de tiempo.
Estaba teniendo el mismo problema en Xamarin Android con una pantalla en blanco la segunda vez. Configurar lo siguiente lo arregló para mí.
viewPager.SaveFromParentEnabled = false;
Pude resolver esto reemplazando getFragmentManager()
con getChildFragmentManager()
en el fragmento principal. Este fragmento padre estaba instalando un android.support.v4.app.FragmentPagerAdapter para contener fragmentos paginable (deslizable), que requiere un administrador de fragmentos en el constructor. A este constructor le pasé el valor de retorno de getChildFragmentManager()
.
El enlace de hackbod fue clave ( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ), que se encontró en esta publicación. Fragmentos dentro de los fragmentos.
Solucionamos esto al volver a implementar los elementos de paginador de vista como vistas estándar en lugar de fragmentos y cambiar el adaptador en consecuencia.
También puede inicializar el adaptador para casos en los que experimente este error cuando su aplicación se minimice y luego se active.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = getArguments();
mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
View mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
initViewPagerAdapter();
return mView;
}
private void initViewPagerAdapter(){
mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
new setAdapterTask().execute();
}
@Override
public void onResume(){
super.onResume();
initViewPagerAdapter();
}
Tuve el mismo problema por el que cambié el adaptador de FragmentPagerAdapter
a FragmentStatePagerAdapter
y getFragmentManager()
en el fragmento principal a getChildFragmentManager()
La razón detrás de esto es que FragmentStatePagerAdapter
es útil para almacenar un gran número de páginas y la memoria asociada a cada página visitada es menor, ya que solo conserva el estado guardado del fragmento mientras la página no está visible. Esto reduce la sobrecarga al cambiar entre los fragmentos.
Tuve el mismo problema. Cambiar la clase padre de mi PageAdapter de android.support.v4.app.FragmentPagerAdapter
a android.support.v4.app.FragmentStatePagerAdapter
resolver mi ViewPager
visualización de ViewPager
en "segunda vez"!
Tuve la misma cosa, en la segunda vez que llamé al Adaptador de Buscapersonas, la vista de niño devolvió una NullPointerException. Y al cambiar el adaptador en FragmentStatePagerAdapter también resuelvo mi problema.
para mí tuve que llamar esto a mi viewpager:
myViewPager.setSaveFromParentEnabled(false);
Tuve el problema de que el visor no estaba refrescando y todo lo que vi fue una pantalla blanca en blanco donde deberían estar los fragmentos. Estaba pasando getChildFragmentManager pero no ayudó.