@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInVisible();
}
}
J'ai trouvé que cette partie du code n'est pas exécutée.
Ils viennent de changer d'API dans Fragments.
Si vous utilisez cette méthode pour limiter le cycle de vie des fragments:
Vous pouvez désormais définir un état de cycle de vie maximal pour un fragment en appelant setMaxLifecycle () sur une FragmentTransaction. Cela remplace le setUserVisibleHint () désormais obsolète.
Source: https://developer.Android.com/jetpack/androidx/releases/fragment#1.1.0-alpha07 .
Si vous avez besoin de cette méthode car vous essayez de détecter quel fragment est actuellement visible dans ViewPager
. Vous pouvez maintenant simplement utiliser les méthodes onResume
et onPause
à la place, mais avant cela, vous devez modifier le comportement par défaut dans le constructeur FragmentPagerAdapter
.
Comme ça:
FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
Maintenant dans AndroidX
la méthode setUserVisibleHint(boolean isVisibleToUser)
est obsolète et si vous regardez la documentation, elle dit:
Vous pouvez maintenant définir un état max
Lifecycle
pour un fragment en appelantsetMaxLifecycle()
sur unFragmentTransaction
. Cela remplace lasetUserVisibleHint()
désormais obsolète.FragmentPagerAdapter
etFragmentStatePagerAdapter
ont un nouveau constructeur qui vous permet de passer au nouveau comportement.
Donc, fondamentalement, lorsque vous utilisez cette approche dans FragmentTransaction
:
.getSupportFragmentManager()
.beginTransaction()
.setMaxLifecycle(fragment, Lifecycle.State.STARTED);
serait équivalent à setUserVisibleHint(false)
et:
.getSupportFragmentManager()
.beginTransaction()
.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);
serait équivalent à: setUserVisibleHint(true)
Cette réponse suppose que vous utilisez FragmentStatePagerAdapter
Sur la nouvelle version de androidx.fragment
(À partir de 1.1.0+), Fragment.setUserVisibleHint
Sera toujours appelé si votre FragmentStatePagerAdapter
utilise l'ancien comportement, spécifié par BEHAVIOR_SET_USER_VISIBLE_HINT
.
Si vous avez construit votre FragmentStatePagerAdapter
et passé BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
, Alors Fragment.setUserVisibleHint
Ne sera plus appelé dans FragmentStatePagerAdapter.instantiateItem
.
REMARQUE: vous pouvez toujours appeler le Fragment.getUserVisibleHint
Déconseillé si vous avez spécifié BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
Dans votre FragmentStatePagerAdapter
, mais sachez qu'il renverra true
même si Fragment.isResumed()
renverra false.
Le projet androidx
est open source. En jetant un œil au dernier code sur master, vous pouvez voir qu'un if
a été ajouté autour de setUserVisibleHint
dans instantiateItem
: https: // Android. googlesource.com/platform/frameworks/support/+/androidx-master-dev/fragment/fragment/src/main/Java/androidx/fragment/app/FragmentStatePagerAdapter.Java#195
TL; DR:
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);
}