Tengo una interfaz de fragmentos 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 de esta lista, se abre otro fragmento que contiene un visor que se desplaza horizontalmente entre todos los elementos de la lista del fragmento anterior. Esto funciona muy bien.
El visor usa un FragmentPagerAdapter para mostrar los elementos.
El problema surge cuando el usuario selecciona un elemento de 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 del visor. No recibo ningún error en mi LogCat cuando esto sucede.
¿Por qué el visor 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);
}
}
FragmentPagerAdapter
yFragmentStatePagerAdapter
es que el primero es más adecuado para pocas páginas, retiene todos los fragmentos en la memoria, por lo que tiene el mejor rendimiento en el cambio de página, mientras que el segundo es más adecuado para muchas páginas. páginas, destruye fragmentos, manteniendo solo su estado, es más eficiente en memoria pero un poco más lento en el cambio de página.Me las arreglé para resolver esto reemplazando
getFragmentManager()
congetChildFragmentManager()
en el fragmento principal. Este fragmento principal estaba instalando un android.support.v4.app.FragmentPagerAdapter para contener fragmentos paginables (deslizables), lo que requiere un administrador de fragmentos en el constructor. A este constructor pasé el valor de retorno degetChildFragmentManager()
.El enlace de hackbod era clave ( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ), que se encontró en esta publicación Fragmentos dentro de Fragmentos
fuente
FragmentStatePagerAdapter
resuelve la pregunta que se hace aquí. junto con elFragmentStatePagerAdapter
fragmento principalYourAdapter adapter = new YourAdapter (getChildFragmentManager());
debe agregarsepara mí tuve que llamar a esto en mi visor:
Tuve el problema de que el visor no se actualizaba y todo lo que vi fue una pantalla en blanco donde deberían estar los fragmentos. Estaba pasando getChildFragmentManager pero no ayudó.
fuente
En mi caso muy particular, donde estaba usando un CoordinatorLayout con un AppBarLayout y el ViewPager, lo que me resolvió fue eliminar el android: fitSystemWindows = "true" de mis propiedades xml de AppBarLayout .
No me preguntes por qué. Sé que suena un poco ridículo y que 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 solo para encontrar esto, así que espero que le ahorre algo de tiempo a alguien más.
fuente
Yo tenía el mismo problema para el que he cambiado adaptador de
FragmentPagerAdapter
aFragmentStatePagerAdapter
ygetFragmentManager()
en el fragmento de padres agetChildFragmentManager()
La razón detrás de esto es que
FragmentStatePagerAdapter
es útil para almacenar una gran cantidad de páginas y la memoria asociada con cada página visitada es menor, ya que solo mantiene el estado guardado del fragmento mientras la página no está visible. Esto reduce la sobrecarga al cambiar entre los fragmentos.fuente
Intente poner
setOffscreenPageLimit (int limit)
el ViewPager principal.Esto funcionó para mí a las mil maravillas.
En mi caso tenía un fragmento dentro
TabLayout
conViewPager.
Y otro
ViewPager
dentro de ese fragmento. La primera vez todo funciona bien, pero cuando cambio de pestaña y regreso, parte de mi fragmento se quedó en blanco.fuente
Esto te ayudaría.
fuente
Solucionamos esto volviendo a implementar los elementos del paginador de vistas como vistas estándar en lugar de fragmentos y cambiando el adaptador en consecuencia.
fuente
Estaba teniendo este mismo problema en Xamarin Android con una pantalla en blanco la segunda vez. La configuración de lo siguiente lo solucionó.
fuente
También puede inicializar el adaptador para los casos en los que experimente este error cuando su aplicación se minimice y luego se invoque.
fuente
Tuve lo mismo, en la segunda vez que llamo al Adaptador de buscapersonas, la vista secundaria devuelve una NullPointerException. Y cambiar el adaptador en FragmentStatePagerAdapter también resuelve mi problema.
fuente
Cambiar
FragmentPagerAdapter
aFragmentStatePagerAdapter
uso engetChildFragmentManager()
lugar degetFragmentManager()
getChildFragmentManager()
- porque de acuerdo con la documentación, devolverá un FragmentManager privado para colocar y administrar Fragmentos dentro de este Fragmento. Mientras tantogetFragmentManager()
, devolverá el FragmentManager para interactuar con los fragmentos asociados con esta actividad.fuente
class ViewPagerAdapter extiende FragmentStatePagerAdapter este trabajo para mí prueba esto
fuente