tutorial tag qué programacion manager instalar google funciones fragmento contenedor como android user-interface android-fragments android-viewpager

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



manual de programacion android pdf (10)

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)


¿Qué hay de malo con el uso de getView().isShown() para averiguar si un Fragmento es realmente 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(); } } }


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"); } }


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 } }



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.


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


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(); }


¡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 SCOLL_STATE_IDLE vuelva a SCOLL_STATE_IDLE .


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 }