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 :

Retour d'Intent suite à appui sur bouton de retour


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Retour d'Intent suite à appui sur bouton de retour
    Bonjour à toutes et à tous,

    Je lance une activité secondaire comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			aff_Courbes = new Intent(BaseAppli.this, AffCourbes.class);
    			aff_Courbes.putExtra("typeAff", typeAff); // Affichage temporel ou en fréquence
    			aff_Courbes.putExtra("nbCourbes", GLB.nbCourbes); // On n'affiche que le signal d'excitation
    			startActivityForResult(aff_Courbes, PRM_COURBE); // Page d'affichage des courbes
    J'arrive dans mon activité secondaire, j'y fais ce que j'ai à y faire et j'en sors en disant que c'est tout bon --> "RESULT_OK" par le bouton "retour", ce qui est intercepté par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	@Override
    	protected void onPause() {
    		super.onPause();
    		aff_Courbes.putExtra("typeAff", typeAff);
    		setResult(RESULT_OK, aff_Courbes);
    		finish();
    	}
    De retour dans mon activité principale, j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	public void onActivityResult(int requestCode, int resultCode, Intent data) {
    		super.onActivityResult(requestCode, resultCode, data);
    		if (resultCode > 0 || resultCode == RESULT_OK) {
    			switch (requestCode) {
    				case PRM_COURBE:
    					...
    Le resutCode n'est pas à RESULT_OK, il vaut "0" et data vaut null ???

    Il n'y a donc pas moyen de récupérer des données de l'activité secondaire lorsqu'on la quitte par le bouton "retour" ?

    Merci de votre aide.

    Pierre

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2014
    Messages : 262
    Par défaut
    Bonsoir ChPr,

    Dans la méthode callback onPause(), vous avez appelé finish() comme pour finir l'Activity pendant qu'elle

    est entrain de finir ! Vous ne pensez pas que ça peut être la source du soucis ?

    Si tel n'est pas le cas, soyons un peu plus spécifiques en utilisant le callback Activity.onBackPressed() qui est appelée lorsque le button

    retour est appuyé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
        public void onBackPressed(){
            super.onBackPressed();/*éffectue une animation de transition si y a en, avant de finir l'Activity*/
        }
    __salut !

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci "lankoande" pour ces propositions. Toutefois chacune de ces deux solutions me retourne la même chose que ce que j'avais, c'est-à-dire : Le resutCode n'est pas à RESULT_OK, il vaut "0" et data vaut null.

    NOTA : je me suis débrouillé autrement .

    Cordialement.

    Pierre

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Parce ce que quand l'utilisateur appuie sur la touche "back", le système va "finir" l'activité (c'est l'opération par défaut).
    Ce "finish" va populer l'intent de retour (et la valeur) pour retour à l'activité principale.
    En prime rien n'assure que le "onPause" sera appelé avant le onActivityResult de l'activité d'avant.

    Appeler finish() dans le onPause est de toute manière très étrange... Si jamais on reçoit un coup de téléphone, bim, l'activité se ferme ?
    (le onPause est appelé dès que l'activité n'est plus au premier plan).


    Il y a deux façons d'appréhender le truc:
    * Ou bien l'activité appelée "fonctionne" toujours (pas de bouton de validation par exemple), alors il est inutile de tester le résultat dans le onActivityResult. Si par contre, il y a besoin de passer des valeurs de retour, alors conserver le Bundle des extras de l'intent de retour, et modifier ce Bundle à la volée quand nécessaire (et commencer dans le onCreate par un setResult(RESULT_OK,myBackIntent) ). Cela semble quand même étrange d'avoir des valeurs de retour sans validation à un moment ou à un autre. L'autre façon de faire est de partager les données (BDD, fichier, mémoire) le retour signifiant à l'activité initiale que ces données ont été modifiées (pas d'intent de retour, mais setResult(S_OK) dès que les données ont été modifiées).
    * Ou bien l'activité appelée possède un bouton de validation, alors c'est *ce* bouton qui doit faire le setResult(S_OK) et le finish(), le onCreate lui fera un setResult(RESULT_CANCEL) histoire d'être sur qu'on reçoive bien cancel dans les autres cas.

    Je suis toujours dubitatif quant à la surcharge du onBackPressed(). Sauf dans de rares exceptions, j'ai toujours l'impression que la surcharge est une manière de modifier le comportement par défaut d'Android et donc de confusionner l'utilisateur (vive les néologismes ! ).

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci pour ces précisions.

    Citation Envoyé par nicroman Voir le message
    ... * Ou bien l'activité appelée "fonctionne" toujours (pas de bouton de validation par exemple), alors il est inutile de tester le résultat dans le onActivityResult. ...
    Par cette phrase, tu me dis que il n'y a rien à recevoir de l'intent ... ce que je traduis par resultCode = 0 et data = null : c'est ce que je vois.

    L'utilisation bizarre de finish() que j'avais placée dans le onPause était due au fait que je n'avais pas bien compris son utilité : je croyais, à tort, que c'était ce qui déclenchais le transfert des données vers l'activité principale.

    Cordialement.

    Pierre

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par ChPr Voir le message
    L'utilisation bizarre de finish() que j'avais placée dans le onPause était due au fait que je n'avais pas bien compris son utilité : je croyais, à tort, que c'était ce qui déclenchais le transfert des données vers l'activité principale.
    Mais c'est bien le cas...
    Sauf que le onPause() est lui-même appelé suite au finish (mais pas seulement, il est aussi appelé dès que l'activité n'est plus au premier plan).

    Un appel à finish() (suite à un back-pressed par exemple) va justement demander au système de supprimer l'activité, ce qui va de fait appeler onPause(), onStop() et onDestroy() sur cette activité....
    C'est bien le finish() qui a passé les données à l'activité précédente, et le fait que l'activité précédente arrive au premier plan qui va appeler le onPause()....
    D'ou ma remarque: pas sur que le onActivityResult() ne soit pas appelé *avant* le onPause().

    Par cette phrase, tu me dis que il n'y a rien à recevoir de l'intent ... ce que je traduis par resultCode = 0 et data = null : c'est ce que je vois
    Non... le resultCode et data viennent du dernier appel à setResult() dans l'activité fille. Cet appel peut très bien avoir été fait pendant le onCreate (et les données modifiées au cours de la vie de l'activité) !

    Cordialement.

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

Discussions similaires

  1. changer de panel quand appuie sur bouton
    Par claire13 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 17/04/2008, 13h53
  2. Réponses: 9
    Dernier message: 23/07/2007, 15h24
  3. sauvegarde liant des données par appui sur bouton
    Par Flavien44 dans le forum IHM
    Réponses: 2
    Dernier message: 11/06/2007, 18h20
  4. Réponses: 13
    Dernier message: 18/07/2006, 15h07
  5. Réponses: 1
    Dernier message: 05/07/2006, 08h34

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