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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    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
    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 éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2018
    Messages : 63
    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 éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

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

    Bon courage

  4. #4
    Membre actif
    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
    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 éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2018
    Messages : 63
    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
    Membre actif
    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
    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.

+ 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