31 votes

Cycle de vie des activités - réception d'une notification indiquant que la mise en page est terminée

J'ai une activité dans laquelle j'ai 3 boutons placés les uns à côté des autres. J'ai utilisé une sous-classe de bouton qui redimensionne le texte du bouton pour éviter que le texte ne s'enroule. Je voudrais que les 3 boutons partagent la même taille de texte. Pour ce faire, j'ai l'intention de détecter le bouton dont la taille du texte est la plus petite et de régler les deux autres boutons sur cette taille.

Le problème que j'ai est de savoir quand l'activité a terminé de disposer ses composants, de sorte que je puisse savoir de manière fiable que le redimensionnement du texte a eu lieu. D'après la documentation Android, il semblerait que la dernière notification du cycle de vie soit onResume(), mais il semble que la mise en page ne soit pas terminée à ce stade. Existe-t-il un moyen de recevoir une notification indiquant que la mise en page de l'activité est terminée ?

28voto

Greg Points 313

J'ai fait quelque chose de similaire en utilisant des observateurs d'arbres. Vous devrez peut-être jouer un peu avec pour trouver à quelle(s) vue(s) il doit être attaché, mais cela se déclenchera une fois que la vue sera définie. A partir de là, vous pouvez obtenir la taille du texte, et faire les modifications nécessaires.

mTestButton.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // make sure it is not called anymore 
        mTestButton.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        float size = mTestButton.getTextSize();
    }
});

EDIT :
La méthode #removeGlobalOnLayoutListener a été dépréciée, mais est toujours valide. Pour utiliser à la fois la nouvelle et l'ancienne méthode, voir cette réponse de stackoverflow .

2voto

matsjoe Points 1124

D'après ce que je sais, il n'y a pas d'événement ou quelque chose qui vous indique que tout est chargé. Ce que vous pouvez peut-être faire, c'est de lancer, à la fin de la méthode oncreate, une tâche asynchrone qui s'exécute pendant que la largeur de la dernière vue est égale à 0. Dans le callback de l'ASyncTask, vous pouvez alors calculer le plus petit bouton et déterminer la taille de la police.

1voto

Alex Lockwood Points 31578

El Activity et sa fenêtre/son agencement ne sont pas intrinsèquement liés. Vous avez toutefois la garantie que la Button existent tant que vous les manipulez après avoir appelé setContentView .

0voto

QRohlf Points 1318

Vous pourriez peut-être définir un OnLayoutChangeListener sur vos boutons (ou le groupe de vues contenant les boutons) et effectuer le redimensionnement de la police à cet endroit ? Je ne sais pas si cela est appelé avant ou après que les modifications de la mise en page aient pris effet...

0voto

Charles Harley Points 2773

Vous pouvez essayer de remplacer Activity.onWindowFocusChanged(booléen) pour recevoir une notification fiable lorsque l'activité est devenue visible. Vous pouvez alors supposer que la mise en page est terminée. Un problème que vous pourriez rencontrer avec cette approche est que l'activité sera visible pour l'utilisateur et donc si le texte du bouton est redimensionné, le changement de taille sera brièvement visible pour l'utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X