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
}
}
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://.com/a/12523627/2069407
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
}