Activity - onCreate() - Initialisation incomplète des objets graphiques

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.

Pour avoir l’information, je dois cliquer sur le bouton qui utilise EXACTEMENT le même code, sauf qu’avec lui, ça fonctionne …

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.

Salut,
Cela peux peut-être t’aider : https://developer.android.com/guide/components/activities/activity-lifecycle

Je ne me suis pas encore trop pris de temps pour android donc, je ne connais pas la réponse.

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 …

D’accord j’ai trouvé une doc plus précis https://developer.android.com/reference/android/app/Activity

vas voir du coté de la function onWindowFocusChanged

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.

Salut Draken,

j’ai trouver ce code sur le net ça à l’air de fonctionner:

package com.nicopicks.getsizemainview

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.DisplayMetrics
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val displayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        var width = displayMetrics.widthPixels.toString()
        var height = displayMetrics.heightPixels.toString()

        textview.text = width + " " + height


    }


}

source : https://www.tutorialkart.com/kotlin-android/get-screen-width-and-height-programmatically-example/

:blush:

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.