Saltar al contenido

en androidx.fragment.app.Fragment, setUserVisibleHint () está en desuso y no se ejecuta, ¿por qué?

Si hallas algún error en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.

Solución:

Acaban de cambiar la API en Fragmentos.

Si usa este método para limitar el ciclo de vida de los fragmentos:

Ahora puede establecer un estado de ciclo de vida máximo para un fragmento llamando a setMaxLifecycle() en una FragmentTransaction. Esto reemplaza el ahora obsoleto setUserVisibleHint().

Fuente: https://developer.android.com/jetpack/androidx/releases/fragment#1.1.0-alpha07.

Si necesita este método porque intenta detectar qué fragmento está visible actualmente en ViewPager. Ahora puedes simplemente usar onResume y onPause en su lugar, pero antes de eso, debe cambiar el comportamiento predeterminado en FragmentPagerAdapter constructor.

Como esto:

FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)

Ahora en AndroidX método setUserVisibleHint(boolean isVisibleToUser) está en desuso y si echa un vistazo a la documentación, dice:

Ahora puede establecer un máximo Lifecycle estado para un Fragmento llamando
setMaxLifecycle() en un FragmentTransaction. Esto reemplaza el ahora obsoleto setUserVisibleHint(). FragmentPagerAdapter y
FragmentStatePagerAdapter tenga un nuevo constructor que le permita cambiar al nuevo comportamiento.

Entonces, básicamente, cuando usas este enfoque en FragmentTransaction:

.getSupportFragmentManager()
            .beginTransaction()
            .setMaxLifecycle(fragment, Lifecycle.State.STARTED);

sería equivalente a setUserVisibleHint(false) y:

.getSupportFragmentManager()
            .beginTransaction()
            .setMaxLifecycle(fragment, Lifecycle.State.RESUMED);

sería equivalente a: setUserVisibleHint(true)

Esta respuesta asume que estás usando FragmentStatePagerAdapter

En la nueva versión de androidx.fragment (desde 1.1.0+), Fragment.setUserVisibleHint seguirán siendo llamados si su FragmentStatePagerAdapter está usando el comportamiento anterior, especificado por BEHAVIOR_SET_USER_VISIBLE_HINT.

Si ha construido su FragmentStatePagerAdapter y pasó BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENTdespués Fragment.setUserVisibleHint ya no se llamará dentro FragmentStatePagerAdapter.instantiateItem.

NOTA: todavía puedes llamar a los obsoletos Fragment.getUserVisibleHint si has especificado BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT en tus FragmentStatePagerAdapterpero tenga en cuenta que volverá true a pesar de Fragment.isResumed() regresará false.


los androidx proyecto es de código abierto. Al echar un vistazo al código más reciente en el maestro, puede ver que un if se ha agregado alrededor setUserVisibleHint en el interior instantiateItem: https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java#195

TL;RD:

1.0.x:

fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);

1.1.0+:

fragment.setMenuVisibility(false);
if (mBehavior == BEHAVIOR_SET_USER_VISIBLE_HINT) 
    fragment.setUserVisibleHint(false);

Si te mola el tema, puedes dejar un ensayo acerca de qué le añadirías a este artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *