Cómo determinar si un fragmento es visible para el usuario
Directamente en Actividad
Este escenario de aplicación es el más simple, es decir, usar XML para introducirlo en Actividad, o usar addFragment o replaceFrament de FragmentManager para carga dinámica. En este caso, simplemente escuche los métodos onResume y onPause del Fragmento para determinar su comportamiento. Entre onResume y onPause, el usuario es visible.
@Override
public void onResume() {
super.onResume();
//TODO ahora es visible para el usuario
}
@Override
public void onPause() {
super.onPause();
/ /TODO ahora es invisible para el usuario
}
Utilice mostrar y ocultar para implementar Fragment visible
Además de addFragment y replaceFragment, FragmentManager también tiene showFragment y hideFragment se utilizan para hacer que el Fragmento sea visible o invisible, lo que puede aumentar la velocidad de cambio de página y es una forma de intercambiar espacio por tiempo. Sin embargo, a un Fragmento utilizado de esta manera no se le llamará su método onPause cuando esté oculto. onHiddenChanged(hidden);
if(hidden){
//TODO ahora es visible para el usuario
} else {
// TODO ahora es invisible para el usuario
}
}
Pero a lo que debemos prestar atención es que si el usuario presiona el botón de inicio para salimos y nuestro programa no está escuchando el evento de presión del botón de inicio, y se llama a hideFragment cuando se presiona el botón de inicio, entonces en realidad no se llama a onHiddenChanged, pero sí a onPause. Por lo tanto, debemos manejar esta situación de manera especial. Por ejemplo, estaría bien mostrar una llamada a hideFragment cuando se cierra la tecla de inicio, o indicar en onPause que el Fragmento ya no está visible.
Fragmento en ViewPager
Ahora, básicamente todas las aplicaciones en el mercado de Android realizarán operaciones con pestañas, y las pestañas se implementan básicamente a través del propio ViewPager de Android. ViewPager tiene una función que al deslizarse hacia una pestaña, cargará el contenido de ambas pestañas. En este punto, necesitamos escuchar setUserVisibleHint para determinar si el usuario es visible.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
Si (isVisibleToUser) es verdadero Si el usuario no es visible, entonces debemos escuchar setUserVisibleHint.
p>if(isVisibleToUser){
/TODO ahora es visible para el usuario
} else {
/TODO ahora es invisible para el usuario
}
}
Pero al igual que en el segundo artículo, todavía no podemos confiar completamente en el método setUserVisibleHint para determinar si la página en ViewPager es visible para el usuario. Esto se debe a que este método solo se llama cuando se cambia el fragmento. Por ejemplo, si salto de una Actividad que contiene un ViewPager a otra Actividad, no se llamará al método setUserVisibleHint del Fragmento en ViewPager y solo se podrá juzgar a través de onPause. El principio para ingresar a la Actividad es similar. Por lo tanto, necesitamos combinar setUserVisibleHint con onResume y onPause.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if ((isVisibleToUser && isResumed()) ){
onResume();
} else if (! isVisibleToUser) {
Timber.i("En pausa en %s fragmento invisible", getClass ().i("On Resume on %s Fragment Visible",getClass().getSimpleName());
/TODO Envía una señal de que el fragmento es visible
}
}
@Override
public void onPause() {
super.onPause();
Si (getUserVisibleHint( ))onPause();
//TODO señala que el fragmento es invisible
}