0

J'ai une activité qui affiche divers fragments à l'aide de supportFragmentManager. Lorsque j'essaie d'obtenir une vue dans le fragment ou l'activité parente, et que je tente de mesurer sa position sur l'écran, elle ne semble disponible pour la mesure qu'après onResume dans le cycle de vie du fragment ou après onActivityCreated/onResume/onAttachedToWindow dans l'activité. Typiquement, il est disponible après environ 100-200ms. Y at-il un événement de cycle de vie documenté/non documenté ou une méthode solide de savoir quand cela s'est produit, comme peut-être un événement de dessin de toile. Le fragment en question doit mesurer une vue d'activité parent, mais il n'est pas toujours disponible dans onResume immédiatement. Je déteste vraiment avoir à faire une sorte de piratage comme avoir un gestionnaire attendre 200ms.Dans un cycle de support Fragment, toutes les vues sont-elles réellement affichées à l'écran?

Répondre

1

Vous pouvez utiliser ViewTreeObserver.addOnGlobalLayoutListener().

@Override 
public void onCreate(Bundle savedInstanceState) { 
    //... 
    someView.getViewTreeObserver().addOnGlobalLayoutListener(getOnLayoutListener(someView)); 
    //... 
} 

private ViewTreeObserver.OnGlobalLayoutListener getOnLayoutListener(final View unHookView) { 
    return new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) 
       unHookView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      else 
       unHookView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      //YOUR CODE HERE 
     } 
    }; 
} 
+0

Permet de faire une photo. Tks. –

+0

Vraiment proche, l'auditeur semble vouloir persister dans le fragment même si enlever dans le fragment onPause et/ou onDetach provoquant l'abandon de l'activité dans onDestroy en raison de la présence de l'écouteur, puisque je regarde une vue d'activité, doit regarder plus loin. Les informations de la vue sont disponibles pour la vue dans le fragment. :) –

+0

@PeterBirdsall l'écouteur est supprimé juste à l'intérieur de la méthode 'onGlobalLayout' .. il sera donc supprimé immédiatement après la mise en page. Si vous faites face à une condition de concurrence avec des ajouts et des suppressions rapides de fragments, vous pouvez vérifier si le fragment est toujours ajouté dans 'onGlobalLayout()' en utilisant la condition 'YourFragment.this.isAdded()' – Gero