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

Composants graphiques Android Discussion :

Empilement des activités, (retour en arrière et bouton back) Comment les utiliser


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 66
    Par défaut Empilement des activités, (retour en arrière et bouton back) Comment les utiliser
    Bonjour à tous,

    Je rencontre un petit problème sur mon application.
    J'ai peut être mal compris tout ce qui est tâche et pile d'activité mais je vais vous présenter mon problème en essayant d'être clair car ce n'est pas simple à expliquer et sur le forum je ne trouve pas de réponse.

    Mon application se compose d'un main et de 4 boutons (elle n'est pas fini), ces boutons renvoient tous vers une nouvelle activité.
    Quand je clique sur un bouton cela ouvre une nouvelle activité, chose normale, mais c'est le retour en arrière qui pose problème.

    En gros je vous résumé ce que je viens de faire dans mon application (en termes de clics).

    1) Je commence je suis dans le Main, je clique sur le bouton 1 et j'arrive sur l'activité 1, il n'y a encore rien donc j'appuie sur le bouton Back du téléphone et je retourne dans le main.
    Main -> Activité 1 (bouton back téléphone) ->

    2) Je suis dans le Main (de nouveau), je clique sur le bouton 2 et j'arrive sur l'activité 2, l'activité 2 a 3 boutons, je clique sur le 1er qui me fait un retour vers le main, je reclique sur le bouton 2 qui m'envoie à nouveau sur l'activité 2 et je clique sur le 2eme bouton de cette activité qui fait aussi un retour sur le main (j'ai pas encore codé les 2 premiers boutons juste ils ont un entent qui renvoie au clic sur le Main), une fois revenue dans le main je clique sur le bouton 2 et je reviens dans l'activité 2, je clique sur son 3eme bouton et cela m'ouvre une nouvelle activité que j'appellerai l'activité 2_Suite, ici je dois remplir mon profil mais ce n'est pas encore codé alors j'appuie juste sur le bouton back du téléphone qui me renvoie sur l'activité 2 (pas fermée) où je rappuie encore sur back et je suis de retour dans le main.
    Main -> Activité 2 (bouton retour intent) -> Main -> Activité 2 (bouton retour intent) -> Main -> Activité 2 -> Activité 2_Suite (bouton back) -> Activité 2 (bouton back) ->

    3) A nouveau dans le Main, je clique sur le bouton 3 et j'arrive sur l'activité 3, ici c'est juste du texte et j'ai un bouton Retour, je clique dessus et il m'ouvre le Main (je ne clique pas sur le Back du téléphone)
    Main -> Activité 3 (bouton retour intent) ->

    4) Je reviens donc dans le Main où je clique sur le bouton 4 qui m'ouvre l'activité 4, dans l'activité 4 il y a un EditText que je rempli et je clique sur le bouton qui me renvoie dans un intent ce texte dans le Main (où il sera affiché).
    Main -> Activité 4 (clique bouton intent résultat text) -> Main (avec le texte affiché)

    5) Ensuite me revoilà de retour dans le Main où je vais cliquer sur le bouton Back du téléphone pour en sortir sauf que le résultat attendu n'est pas celui là, car je me retrouve dans mon Activité 3 (clic back) alors je reclique sur le bouton back plusieurs fois pour sortir de l'application et revenir sur le Home.

    Main -> Activité 3 -> Main -> Activité 2 -> Main -> Activité 2 -> Main -> Quitte l'application (Home)


    Donc le problème c'est qu'apparement plusieurs Main se créé et que plusieurs de mes activités (notamment la 2) se créé et ne se ferme pas.

    J'aimerais que quand je suis dans le Main je sorte simplement de l'application quand je clique sur le bouton Back du téléphone.
    J'ai tenté de mettre des "finish()" dans tous les onPause() de mes activités sauf le main mais toutes les activités se ferment directement.
    Ex: si je suis dans le Main -> Je clique sur le bouton 2, j'entre dans l'activité 2 puis j'entre dans l'activité 2_Suite, avec les finish() lorsque je fais le bouton Back alors je ne retourne pas en arrière, je retourne directement dans le main mais ce n'est pas non plus ce que je veux.

    J'ai aussi pensé à redéfinir la fonction "onBackPressed()" mais je ne sais pas si ça peut correspondre.


    Est-ce que quelqu'un aurait une explication à mon problème et saurait comment le résoudre? Car il n'y a bien sûr aucune erreur dans le Logcat à ce sujet.


    Merci à vous tous pour vos réponses, j'espère avoir été assez clair.
    Bonne soirée.
    Pikkoro359

  2. #2
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    J'ai lu en diagonale mais je pense qu'il faut que tu lances tes activity avec startActivityForResult() et non pas startActivity()
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 66
    Par défaut
    Merci Hephaistos007 pour ta réponse.

    Tu crois? Car en mon bouton retour ne demande pas de résultat.

    Je te mets le code de mon bouton retour, en fait je pense qu'il recrée une nouvelle activité Main plutôt que de retourner au Main déjà ouvert.

    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
     
    public class StatsActivity extends Activity {
     
        Button retour;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_stats);
     
            retour = (Button) findViewById(R.id.retour);
            retour.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intentRetour = new Intent(StatsActivity.this, MainActivity.class);
                    startActivity(intentRetour);
                }
            });
        }
    }

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Je me suis aussi perdu dans la lecture, mais 2 choses :
    - evite d'utiliser un bouton back dans une activité. Il y en a déjà un physique sur Android, autant en profiter. Sinon gère la flèche back de la toolbar (si t'en as une).
    - il est très fréquent de devoir redéfinir le onBackPressed(), pour bien fermer un service, un handler par exemple, ou même définir son style de sortie : double clic ou demande de confirmation. Et si ton seul souci est de sortir proprement de l'application, tu devras le faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public void onBackPressed() {
        finish();
    }
    ou mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
    public void onBackPressed() {
        finishAffinity();
    }

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Pour répondre à ta réponse, oui l'activité main est recréé (voir schéma du lien), d'où l'intéret de gérer le back plutot que un intent
    https://developer.android.com/guide/...s-filters.html

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 66
    Par défaut
    Merci Turvy pour ta réponse.

    C'est déjà plus clair.
    Toutefois, tu peux juste me dire la différence entre les 2 codes que tu as mit ?
    Car je m'étais le "finish()" dans la méthode onPause() mais ça me termine mes activités, et si je reviens en arrière, alors toutes les activités fermées par le "finish()" n'apparaissent plus.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Je ne peux que t'inciter à lire ca : https://developer.android.com/refere.../Activity.html et donc .
    En gros finishAffinity() permet de fermer d'autres activités d'une autre application (dans le cas d'intent exterieur).

    Si tu veux garder ta facon de faire, normalement finish() suffit. Donc en mettant dans ton Main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Override
    public void onBackPressed() {
        finish();
        super.onBackPressed(); // pas indispensable
    }
    ca résoud le problème.

    Mais en théorie, tu n'as pas besoin de redéfinir ton back du main, mais plutot tes boutons retour des autres activités. Au lieu de lancer des intents vers le Main, il te suffit juste de rappeler la méthode onBackPressed().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    onClick(){
    onBackPressed();
    }
    Après, j'insiste, mais niveau expérience utilisateur, il n'est pas bon d'avoir plusieurs boutons qui font la même chose : tes boutons Retour ou back du téléphone, surtout si l'utilisateur est déjà obligé de l'utiliser pour certaines activités

  8. #8
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Salut les amis,

    Citation Envoyé par Pikkoro359 Voir le message
    Car je m'étais le "finish()" dans la méthode onPause() mais ça me termine mes activités, et si je reviens en arrière, alors toutes les activités fermées par le "finish()" n'apparaissent plus.
    Pas étonnant de voir ce comportement car quand tu mets finish() Dans onPause(), chaque fois que ton application ou activity perdra le focus, elle s'arrêtera.

    Quand tu passes d'une activity A à une activity B, si dans A tu utilises finish() pendant le passage tu ne seras plus à mesure d'y revenir lorsque tu vas appuyer le bouton back depuis B car l'instance de A sera perdu (à moins que tu utilises un intent pour la relancer ce qui créera une nouvelle instance au lieu de retrouver l'ancienne à l'état dans lequel tu l'avais laissée). Il faut bien étudier dans quelle mesure utiliser finish() afin d'éviter de comportement inattendus.


    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/10/2015, 10h19
  2. Réponses: 1
    Dernier message: 06/08/2013, 12h57
  3. Retour en arrière des editeurs d'environement développeur
    Par Caine dans le forum Débats sur le développement - Le Best Of
    Réponses: 15
    Dernier message: 04/10/2012, 01h50
  4. [FTP]Retour en arrière
    Par aDamas dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 21/02/2006, 17h55

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