En faisant des tests pour comprendre la logique de fonctionnement des Activity, je me suis aperçu qu’au moment du onCreate(), les objets graphiques ne sont pas encore initialisés.
J’ai voulu afficher la taille de la vue principale de l’application, au démarrage.
Pour ce faire, j’ai créé une Empty Activity ne comportant que 3 objets :
La vue principale portant l’identifiant mainView
Un TextView avec l’identifiant textView
Un Button avec l’identifiant bouton
Un code très court :
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Affichage taille de la vue principale
val largeur = mainView.width.toString()
val hauteur = mainView.height.toString()
textView.text = "Taille onCreate : " + largeur + "x" + hauteur
}
fun presserBouton(bouton:View) {
val largeur = mainView.width.toString()
val hauteur = mainView.height.toString()
textView.text = "Taille : " + largeur + "x" + hauteur
}
}
Tel que j’imagine les choses, la fonction onCreat() devrais lire la taille de la fenêtre principale et l’afficher dans le textView au démarrage. Mais cela ne fonctionne pas, la taille de la fenêtre est de 0x0 au lancement de l’application.
J’en déduit qu’Android appelle onCreate() AVANT la création des objets graphiques à partir des contraintes. Quelqu’un connait-il le moyen d’exécuter une routine d’initialisation APRES la création des éléments graphiques, afin de connaître leurs tailles en pixels au démarrage ?
J’ai essayé avec onPostCreate() et onStart(), mais cela ne donne rien.
C’est la première chose que j’ai regardé, pour voir s’il y a l’équivalent des fonctions d’initialisation des ViewControllers d’iOS. Mon anglais étant … euh … pas terrible, je n’ai pas tout compris. Je patauge dans les explications depuis quelques heures, à la recherche de la solution magique …
A lire les forums, il ne semble pas avoir de solution fiable.
Mon idée était d’utiliser le onCreate() pour lancer l’exécution d’une animation au démarrage, ce qui nécessite de connaître la taille de la fenêtre principale. J’ai trouvé un exemple de programme en Java (beurk…) sur le Net, qui fait quelque chose d’équivalent en appelant un timer dans le onCreate(). Avec un bref délai on est (a peu prés) certain que les contrôles graphiques sont prêts, avec la possibilité de relancer le délai d’attente si ce n’est pas encore le cas (size = 0). C’est un peu bidouille, mais cela devrais fonctionner.
J’ai déjà testé cette approche. Cela donne les dimensions physiques de l’écran en pixels, pas la taille de la fenêtre de travail rééllement disponible. La barre de statut en haut (heure, état de la batterie, etc) et le bandeau vert affichant le nom de l’application grignotent une partie des pixels, faussant le résultat.
Ta méthode n’est valable que pour une application fullscreen comme un jeu vidéo, pas une application classique.