web-dev-qa-db-fra.com

dans androidx.fragment.app.Fragment , setUserVisibleHint () est obsolète , et non exécuté, pourquoi?

@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.

18
limengxin

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)
32
lukjar

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 appelant setMaxLifecycle() sur un FragmentTransaction. Cela remplace la setUserVisibleHint() désormais obsolète. FragmentPagerAdapter et FragmentStatePagerAdapter 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)

5
Yupi

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