¿Cómo probar si una vista de fragmento es visible para el usuario?

Tengo una ViewPager, cada página es una vista de Fragmento. Quiero probar si un fragmento está en una región visible. la prueba Fragment.isVisible only

  • el fragmento se adjunta a una actividad
  • el fragmento está configurado en visible
  • el fragmento ha sido agregado a una vista

El ViewPager creará 3 (por defecto) fragmento y los tres cumplen con los criterios anteriores, pero solo uno es visible para el usuario (el ojo humano)

¡Tienes razón, hay una mejor manera de hacer esto!

Eche un vistazo al FragmentPagerAdapter javadoc en línea y verá que hay un método setPrimaryItem (contenedor ViewGroup, posición int, objeto Object): vacío haciendo exactamente lo que necesita.

Desde el javadoc

public void setPrimaryItem (contenedor ViewGroup, posición int, objeto Object)

Llamado para informar al adaptador de qué elemento se considera actualmente el “principal”, es decir, el que se muestra al usuario como la página actual.

Contenedor de parámetros La vista que contiene desde la cual se eliminará la página. position La posición de la página que ahora es la primaria. object El mismo objeto devuelto por instantiateItem (View, int).

Nota sobre el estado de desplazamiento

Ahora bien, si implementa esto y comienza a depurar para tener una idea de cuándo se llama exactamente, rápidamente notará que esto se dispara varias veces al preparar el fragmento y mientras el usuario se desliza.

Por lo tanto, podría ser una buena idea adjuntar un ViewPager.OnPageChangeListener y solo hacer lo que tiene que hacerse una vez que el estado de desplazamiento de los viewpagers se vuelva a SCOLL_STATE_IDLE .

Esto es lo que uso para determinar la visibilidad de un fragmento.

 private static boolean m_iAmVisible; @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); m_iAmVisible = isVisibleToUser; if (m_iAmVisible) { Log.d(localTAG, "this fragment is now visible"); } else { Log.d(localTAG, "this fragment is now invisible"); } } 

Para mis propósitos, funcionó utilizar ViewPager.OnPageChangeListener.onPageSelected() junto con Fragment.onActivityCreated() para realizar una acción cuando el Fragmento está visible. Fragment.getUserVisibleHint() también ayuda.

Estoy usando “setMenuVisibility” -Método para resolver este problema. Como cada Fragmento puede tener elementos de barra de acción, esta es la parte donde puede determinar qué Fragmento está actualmente visible para el usuario.

 @Override public void setMenuVisibility(final boolean visible) { super.setMenuVisibility(visible); if (!visible) { //not visible anymore }else{ yay visible to the user } } 

¿Qué hay de malo con el uso de getView().isShown() para averiguar si un Fragmento es realmente visible?

 isVisible() 

Todavía puede regresar verdadero incluso si el fragmento está detrás de una actividad.

Estoy usando lo siguiente:

 if (getView() != null && getView().isShown()) { //your code here } 

Si sabe a qué “página” se adjunta cada fragmento, podría usar ViewPager.getCurrentItem () para determinar qué fragmento es “visible”.

En mi caso, tengo que trabajar en el primer fragmento cuando el fragmento es visible para el usuario

  @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(viewPager.getAdapter() instanceof YourPager) { Fragment fragemnt=((YourPager)viewPager.getAdapter()).getFragment(0); //getFragment(int index) custom method if( fragemnt instanceof YourFragment) { ((YourFragment)fragemnt).methodWhochShouldBeCalledAfterUIVisible(); } } } 

setUserVisibleHint probablemente no se onHiddenChanged , onHiddenChanged puede onHiddenChanged no cada vez que se cierra otro fragmento. Por lo tanto, puede confiar en onResume (y en onPause ), pero generalmente se llama con demasiada frecuencia (por ejemplo, cuando enciende la pantalla de un dispositivo). También en algunas situaciones no se llama, debe administrar el fragmento actual en la actividad del host y escribir:

 if (currentFragment != null) { currentFragment.onResume(); } 

Kotlin:

 if (userVisibleHint) { // the fragment is visible } else { // the fragment is not visible } 

Java

 if (getUserVisibleHint()) { // the fragment is visible } else { // the fragment is not visible } 

https://developer.android.com/reference/android/app/Fragment.html#getUserVisibleHint ()

https://stackoverflow.com/a/12523627/2069407