66

Tengo una ViewPager, cada página es una vista de Fragmento. Quiero probar si un fragmento está en una región visible. la Fragment.isVisible única prueba¿Cómo se prueba si una vista de fragmento es visible para el usuario?

  • el fragmento se une a una actividad
  • el fragmento se establece en visible
  • el fragmento ha sido añadido a una vista

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

+0

publique su código para obtener una mejor ayuda. – Raj

+2

Seguro que me encantaría saber eso también en este momento. –

Respuesta

21

Tienes razón hay una forma mejor de hacer esto!

Eche un vistazo a FragmentPagerAdapter javadoc en línea y verá que hay un método setPrimaryItem(ViewGroup container, int position, Object object):void haciendo exactamente lo que necesita.

Desde el javadoc

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

Llamado para informar al adaptador de qué elemento se considera actualmente ser el "principal" , esa es la única demostración para el usuario como la página actual .

Contenedor de parámetros La vista que contiene desde donde 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 (Ver, int).

Nota sobre el estado de desplazamiento

Ahora bien, si decide implementar esta forma y empezar la depuración para tener una idea de cuándo esto se llama exactamente se dará cuenta rápidamente esta se dispara varias veces en la preparación del fragmento y mientras el usuario está deslizando a lo largo.

Así que puede ser una buena idea también 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.

+1

este enfoque funciona muy bien si se extiende la clase 'Aplicación' y tiene que probar si se está mostrando una IU particular. Acabo de terminar usando varios booleanos para comprobar si la aplicación estaba en segundo plano, y si se mostraba un fragmento en particular. –

2

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

+4

Esto es lo que estoy haciendo en este momento. Solo estoy pensando si hay otras formas. Gracias – davidshen84

+0

¿Encontraste alguna otra manera? –

62

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

Esto no funciona de acuerdo con la documentación: "Establecer una sugerencia para el sistema sobre si la interfaz de usuario de este fragmento está actualmente visible para el usuario. Esta sugerencia es verdadera y es persistente en el estado de la instancia de fragmento guardar y restaurar" – Edison

+1

Buena solución (+1) pero el código se puede simplificar: \t 'pública setUserVisibleHint vacío (isVisibleToUser booleano) { \t super.setUserVisibleHint (isVisibleToUser); \t m_iAmVisible = false; // predeterminado para no visible \t if (isVisibleToUser) { \t m_iAmVisible = true; \t}} ' \t – PeteH

+2

simplificada es: setUserVisibleHint public void (isVisibleToUser booleano) {super.setUserVisibleHint (isVisibleToUser); m_iAmVisible = isVisibleToUser;} – Kasas

9

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

2

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

Lo que es malo con el uso getView().isShown() para averiguar si un fragmento es realmente visible?

+0

¿Has probado tu idea? Creo que [esta] (http://stackoverflow.com/questions/6796299/view-getvisibility-isshown-return-incorrect-visibility) publicación señaló la misma idea. – davidshen84

+0

Sí. Funciona para mí, como se sugiere en la publicación vinculada. – awy

+0

Aparentemente, no estamos hablando del mismo problema * visibilidad * aquí ... – davidshen84

3
isVisible() 

Todavía puede devolver la verdad incluso si el fragmento está detrás de una actividad.

estoy usando lo siguiente:

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

en mi caso IA tienen que hacer algún trabajo 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(); 
     } 
    } 
} 
0

probablemente no podrá setUserVisibleHint ser llamado, onHiddenChanged puede ser llamado no cada vez que se cierra otro fragmento. Por lo tanto, puede confiar en onResume (y), 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(); 
} 
Cuestiones relacionadas