without with viewpager tablayout studio fragments example android android-fragments android-viewpager

android - with - La llamada de ViewPager setUserVisibleHint después de que se carga el primer Fragmento



tablayout without fragments (6)

En mi aplicación, tengo una ViewPager que contiene muchas pestañas deslizables con Fragmentos dentro. Utilizo el método setUserVisibleHint para detectar cuando un Fragment entra en la pantalla. Esto funciona muy bien cuando el usuario pasa de una pestaña a otra pero no funciona en la primera carga. Para ejecutar el código en el método, tengo que deslizar hacia la izquierda y luego hacia atrás al primer Fragment porque se llama al método onCreateView antes del método onCreateView .

¿Tiene alguna idea de cómo puedo ejecutar este código después de que el primer Fragmento esté visible? ¿Hay algún método en ViewPager u otra cosa?


Bueno, su solución más, y tal vez es mejor configurar OnPageChangeListener , pero funciona para mí. La tarea es determinar si el fragmento actual es visible en la creación. Puedes usar el menú para hacer esto. En tu fragmento:

@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); // set current fragment has its own options menu }

y esto

@Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { ... if(isMenuVisible()) { // menu should be visible if current fragment is visible right now setUserVisibleHint(true); // manually set value to true } ... return view;

Tal vez alguien lo encuentre útil. Esto funciona para mí


Compruebo tu problema, pero onCreateView que se llama al método setUserVisibleHint antes del método setUserVisibleHint

enter code here

porque se llama al método setUserVisibleHint antes del método onCreateView


No entiendo exactamente lo que necesita, pero puede detectar la página del fragmento actual llamando a ViewPager.getCurrentItem que devuelve un entero.

Espero eso ayude.

Buena suerte.


No puede (y no debe) confiar en setUserVisibleHint para esto. En su lugar, debe usar un ViewPager.OnPageChangeListener para obtener devoluciones de llamada cuando una página se vuelve visible. P.ej

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { // do your work } });

Nota : Puede usar ViewPager.SimpleOnPageChangeListener si no necesita escuchar todas las devoluciones de llamada.

Actualizar

setOnPageChangeListener método setOnPageChangeListener ahora está en desuso, use addOnPageChangeListener en addOnPageChangeListener lugar

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { // do your work } });


mViewPagerListener.onPageSelected(0); llamar manualmente mViewPagerListener.onPageSelected(0); en onCreateView en su actividad / fragmento raíz.


ABAJO TRABAJADO PARA MÍ

Por favor crea una vista global como esta

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

y usa esto

@Override public void setUserVisibleHint(boolean isUserVisible) { super.setUserVisibleHint(isUserVisible); // when fragment visible to user and view is not null then enter here. if (isUserVisible && view != null) { onResume(); } }

y en el método OnResume

@Override public void onResume() { super.onResume(); if (!getUserVisibleHint()) { return; } //do your stuff here }