IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Petite incompréhension au niveau de MainActivity


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut Petite incompréhension au niveau de MainActivity
    Bonjour à toutes et à tous,

    Je reviens pour une nouvelle question, toujours dans l'idée d'avancer sur Android et merci à vous tous pour vos conseils.

    Donc une question qui vous semblera simple je pense.

    Imaginons une application avec 2 activités (MainActivity et secondActivity).

    MainActivity ne fait qu'afficher "Hello" et dans le manifest, MainActivity est déclarée comme action MAIN et category LAUNCHER.
    C'est donc MainActivity qui sera lancé en premier dans l'application et au lancement de celle-ci, il y aura donc affiché "Hello"

    J'y ajoute un Intent et un bouton me permettant d'aller sur la second activité (secondActivity), affiché en dessous de ma String "Hello"

    Voici le code de MainActivity:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class MainActivity extends AppCompatActivity
    {
        String myString = "Hello";
     
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            final TextView myStringToDisplay = (TextView) findViewById(R.id.tv_myStringHello);
            myStringToDiplay.setText(myString);
     
            final Button btn_go_page_2 = (Button) findViewById(R.id.btn_go_page_2);
            final Intent intent = new Intent(this, MainActivity2.class);
     
            btn_go_page_2.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    startActivity(intent);
                }
            });
        }
    }
    Enfin, une second activité qui doit afficher la String de MainActivity donc le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class MainActivity2 extends AppCompatActivity
    {
     
        private myString2 = "";
     
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main_2);
     
            final TextView myStringToDisplay2 = (TextView) findViewById(R.id.tv_myStringHe);
     
            // myString2 en dessous ne fonctionne pas car MainActivity.myString n'est pas static.
            // il faudrait que j'ai une instance de MainActivity pour avoir accès à myString dans MainActivity.
            myString2 = MainActivity.myString;
     
            myStringToDisplay2.setText(String.valueOf(myString2));
     
            final Button btn_go_home = (Button) findViewById(R.id.btn_go_home);
            final Intent intent = new Intent(this, MainActivity.class);
     
            btn_go_home.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    startActivity(intent);
                }
            });
        }
    }
    Ma question est la suivante, pourquoi n'ai-je pas accès aux variables de MainActivity puisque celle-ci se lance automatiquement au démarrage de l'application?

    Je sais que je pourrais dans MainActivity2 ajouter une variable avec une instance de MainActivity dans MainActivity2 et ça marche, j'ai essayé mais ça ne me semble pas propre du tout, j'ai l'impression que j'aurais 2 fois MainActivity (à moins que ce soit une deuxième référence à la classe?), voici mon deuxième code de MainActivity2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class MainActivity2 extends AppCompatActivity
    {
     
        private myString2 = "";
     
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main_2);
     
            // Je n'aime pas trop faire ça... Puisque MainActivity se lance tout seul au démarrage de l'application
            final MainActivity firstActivity = new MainActivity();
     
            final TextView myStringToDisplay2 = (TextView) findViewById(R.id.tv_myStringHe);
     
            // Là, j'ai une instance de MainActivity donc j'ai accès à myString sans avoir à passer myString en static.
            myString2 = firstActivity.myString;
     
            myStringToDisplay2.setText(String.valueOf(myString2));
     
            final Button btn_go_home = (Button) findViewById(R.id.btn_go_home);
            final Intent intent = new Intent(this, MainActivity.class);
     
            btn_go_home.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View v)
                {
                    startActivity(intent);
                }
            });
        }
    }
    Comment cible-t-on MainActivity sans l'instancier dans une autre classe pour y avoir accès puisque cette activité est lancée au démarrage, c'est ça qui m'échappe?
    Il y a bien une instance quelque part de MainActivity puisque la premère page affiche bien "Hello" et le bouton?

    Merci à vous tous et un excellent weekend,
    Eric.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2018
    Messages : 63
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    Citation Envoyé par flyeric Voir le message
    Bonjour à toutes et à tous,
    Ma question est la suivante, pourquoi n'ai-je pas accès aux variables de MainActivity puisque celle-ci se lance automatiquement au démarrage de l'application?
    Tu n'y as pas accès car le principe des Activités est spécial. Une activité peut être détruite si on ne l'utilise pas, ça veux dire qu'a n'importe quel moment tu peux perdre l'accès aux variables de cette dernière... C'est pour ça que ce que tu as fait est une très mauvaise pratique !

    Il existe une façon de faire que tu utiliseras beaucoup par la suite si tu continues avec Android, ce sont les intents.
    En effet quand tu veux passer des informations d'une activité à une autre, tu les utilises.

    Avec un exemple :
    Dans ton MainActivity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public final static String KEY_STRING = "MESSAGE";
    String myString = "Hello";
    ...
    Intent newIntent = new Intent(MainActivity.this, MainActivity2.class);
    newIntent.putString(KEY_STRING, myString);
    startActivity(newIntent);
    Ici tu insère ta chaîne de caractère dans l'intent puis tu démarres l'activité.

    Dans ton MainActivity2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public final static String KEY_STRING = "MESSAGE";
    ...
    Bundle b = getIntent().getExtras();
    String myStringFromMainActivity = b.getString(KEY_STRING );

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2018
    Messages : 63
    Points : 96
    Points
    96
    Par défaut
    J'oubliais, tu peux aussi faire passer des objets, listes ou tout autre type à travers les Intents !

    Bon courage

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    Merci beaucoup pour ta réponse Kamenber.

    Une incompréhension de plus réglée.

    Oui, je connaissais le passage de variables dans les Intent et je savais aussi que l'on peut perdre des données si l'acitivté est détruite mais je ne connaissais pas son statut "spécial" et c'est maintenant beaucoup plus clair pour moi. Je veux dire que je ferai autrement.

    Merci Kamenber et bonne semaine à toi,
    Eric.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2018
    Messages : 63
    Points : 96
    Points
    96
    Par défaut
    Pas de problème

    Si tu veux plus de détails sur le cycle de vie d'une activité, lit ce tutoriel:

    http://mathias-seguy.developpez.com/...evie-activite/

    Car les activités d'une application s'empilent lorsque tu ouvres de nouvelles activités et se dépilent lors tu effectues un retour par exemple.
    Quand ton téléphone estimes que l'application utilise trop de ressources, elle se réserve le droit de détruire une partie de la pile !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    Merci Kamenber pour tes précisions.

    Et est-ce mauvaise idée aussi d'utiliser une variable static de MainActivity et de l'utiliser dans une autre classe ou pas de souci?

    Mettons que j'ai des variables "globales" en quelque sorte dans MainActivity:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class MainActivity extends AppCompatActivity
    {
        private static String staticLocation;
        private static String staticCountryCode;
     
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            ...
     
        }
     
        public static String getStaticLocation()
        {
            return staticLocation;
        }
     
        public static String getStaticCountryCode()
        {
            return staticCountryCode;
        }
     
    }
    Et que je veuille récupérer ces valeurs dans une autre classe qui est aussi une activité comme ci-dessous, mauvaise pratique aussi (?):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class uneClasse extends AppCompatActivity
    {
        private static String staticLocation;
        private static String staticCountryCode;
     
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            final String location = MainActivity.getStaticLocation();
            final String countryCode = MainActivity.getStaticCountryCode();
     
        }
    }
    Et si en revanche je fais la même chsoe mais dans une classe qui n'est pas une activité, bonne pratique là (?):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class encoreUneAutreClasse
    {
        private static String staticLocation;
        private static String staticCountryCode;
     
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            final String location = MainActivity.getStaticLocation();
            final String countryCode = MainActivity.getStaticCountryCode();
     
        }
    }
    Merci beaucoup à toi ainsi qu'à tous et bon après-midi,
    Eric.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2018
    Messages : 63
    Points : 96
    Points
    96
    Par défaut
    Ta troisième solution est la bonne, par contre il faut que tu crées une classe Objet (et non pas une activité) qui est ton "modèle". Par exemple un Objet "Adresse" avec un constructeurs et ses accesseurs pour retrouver la localisation et le code postale ...

    Les variables globales ne sont pas une bonne pratique ici. Utilise toujours les Intents.
    Si "staticLocation" et "staticCountryCode" sont des valeurs de paramétrages (comme les paramètres dans ton téléphone), tu peux utiliser les SharedPreferences pour stocker ces données en global et les retrouver depuis n'importe quelle activité.

    J'espère que je suis compréhensif
    N'hésite pas si tu comprends pas quelque chose d'autre

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    Merci, merci, merci Kamenber!

    Merci pour ton aide précieuse.

    Oui j'ai compris tout ce que tu expliques et j'utilise déjà les SharedPreferences dans mon application justement pour qu'un utilisateur n'ait pas besoin de rentrer de nouveau une ville et un code.

    Je précise que après avoir lu ta précédente réponse, je me doutais bien que tu allais me dire que la troisème solution était la meilleure.
    Je précise aussi que j'ai fait une erreur dans le code que j'ai soumis pour la troisième solution.
    En fait il faut enlever onCreate car on est bien dans une classe objet et non une activité. Tu avais certainement noté aussi que je n'extendait pas appCompatactivity donc le code de la trosième solution, aurait dû être comme ça si je ne n'était pas allé un peu trop vite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class encoreUneAutreClasse
    {
        private static String staticLocation;
        private static String staticCountryCode;
     
        public uneClasse()
       {
            String location = MainActivity.getStaticLocation();
            String countryCode = MainActivity.getStaticCountryCode();
       }
    }
    Je précise aussi que dans l'exemple j'initialise les variables dans le constructeur mais c'est juste pour l'exemple.
    Donc là on est d'accord, y'a plus de mauvaise pratique?

    Donc le mieux de toute façon c'est de créer une classe objet à part d'une activité.

    Kamenber, merci beaucoup pour ton support et une belle soirée à toi.

    Ici, 20h54 en Thaïlande et 31° et humidité relative à 100%, purée j'ai chaud!

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2018
    Messages : 63
    Points : 96
    Points
    96
    Par défaut
    Donc là on est d'accord, y'a plus de mauvaise pratique?
    Si, ton code objet ne doit pas être sous cette forme, c'est purement du Java pour le coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class UneClasse
    {
        private static String location;
        private static String countryCode;
        private static final String DEFAULT_LOCATION = "Thaïlande" 
        private static final String DEFAULT_COUNTRY_CODE = "42" 
     
        public UneClasse(String uneLocation, String unCountryCode)
       {
            this.location = uneLocation;
            this.countryCode = unCountryCode;
       }
     
        public UneClasse()
        {
         this(DEFAULT_LOCATION, DEFAULT_COUNTRY_CODE);
        }
    }
    Ici on construit avec des variables en local ! Dans tes activités c'est à toi de créer les objets avec les paramètres que tu souhaites. Tu pourras ainsi récupérer les données de ton objet grâce aux accesseurs. Et entre deux Activités, tu passes l'objet dans l'intent si tu veux


    Ici, 20h54 en Thaïlande et 31° et humidité relative à 100%, purée j'ai chaud!
    Gloups, je suis en France il fait a peine 12 °C

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    Ici on construit avec des variables en local ! Dans tes activités c'est à toi de créer les objets avec les paramètres que tu souhaites. Tu pourras ainsi récupérer les données de ton objet grâce aux accesseurs. Et entre deux Activités, tu passes l'objet dans l'intent si tu veux
    Oui merci Kamenber, bien compris.

    Bon je vais au dodo, minuit pile!

    Bonne soirée à toi et merci pour le soutient, super gentil.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petite incompréhension de config Apache
    Par DevServlet dans le forum Apache
    Réponses: 3
    Dernier message: 14/05/2008, 12h31
  2. [MySQL] Incompréhension au niveau des récupérations de données
    Par kenny49 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/04/2007, 18h19
  3. [Debutant] Petit incompréhension
    Par Tronche dans le forum Langage
    Réponses: 2
    Dernier message: 23/09/2006, 12h51
  4. Petit problème au niveau du login
    Par Grichka dans le forum Windows XP
    Réponses: 2
    Dernier message: 18/09/2006, 11h46
  5. [Thread] petit problème au niveau du reveil d'un thread
    Par sagitarium dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 13/01/2006, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo