Fragmento en ViewPager utilizando FragmentPagerAdapter está en blanco la segunda vez que se ve

Tengo una interfaz de fragmento con pestañas a lo largo de la parte inferior que abren diferentes fragmentos en la vista principal.

Tengo un fragmento en particular que es una lista de elementos. Si el usuario selecciona uno de los elementos de esta lista, se abre otro fragmento que contiene un viewpager que se desplaza horizontalmente entre todos los elementos de la lista del fragmento anterior. Esto funciona muy bien.

El viewpager utiliza un FragmentPagerAdapter para mostrar los elementos.

El problema surge cuando el usuario selecciona un elemento de la lista, lo ve, luego pulsa el botón de 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 del viewpager. No recibo errores en mi LogCat cuando esto sucede.

¿Por qué el viewpager aparece sólo 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); } } 

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 ViewPager en "segunda vez"!

getFragmentManager() solucionar esto reemplazando getFragmentManager() con getChildFragmentManager() en el fragmento padre. Este fragmento padre instanciaba un android.support.v4.app.FragmentPagerAdapter para contener fragmentos paginables (deslizable), lo que requiere un gestor de fragmentos en el constructor. A este constructor pasé el valor de retorno de getChildFragmentManager() .

El enlace de hackbod era clave ( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ), que se encontró en este post Fragmentos dentro de Fragmentos

En mi caso muy particular, donde estaba usando un CoordinatorLayout con un AppBarLayout y el ViewPager, lo que lo solucionó para mí fue la eliminación de la android: fitsSystemWindows = "true" de mis propiedades de AppBarLayout xml .

No me preguntes por qué. Sé que suena un poco ridículo y como no debería tener correlación, pero era esta única línea lo único que estaba causando problemas ya que ya estaba usando getChildFragmentManager () en mi adaptador. Pasé un día entero depurando mi código sólo para encontrar esto, así que espero que salve a alguien más algún tiempo.

Conseguimos alrededor de esto reimplementando los artículos del paginador de la visión como visión estándar más bien que fragmentos y cambiando el adaptador por consiguiente.

Para mí tuve que llamar a esto en mi viewpager:

 myViewPager.setSaveFromParentEnabled(false); 

Tuve el problema de que el viewpager no era refrescante y todo lo que vi fue una pantalla en blanco en blanco donde los fragmentos deben ser. Estaba pasando en getChildFragmentManager pero no ayudó.

También puede inicializar el adaptador para casos en los que experimente este error cuando su aplicación se minimice y más tarde se llame.

 @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 para el cual cambié el adaptador de FragmentPagerAdapter a FragmentStatePagerAdapter y getFragmentManager() en el fragmento padre a getChildFragmentManager() .

La razón detrás de esto es 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 sólo guarda el estado guardado del fragmento mientras la página no está visible. Esto reduce la sobrecarga al cambiar entre los fragmentos.

Tuve la misma cosa, en la segunda vez que llamo el adaptador del paginador, la visión del niño devuelve un NullPointerException. Y el cambio de la adaptación en FragmentStatePagerAdapter resolver mi problema también.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.