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 :

OnActivityResult never called - l'ultime retour (j'espère)


Sujet :

Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 20
    Points
    20
    Par défaut OnActivityResult never called - l'ultime retour (j'espère)
    Bonjour à tous,

    je sais que les problèmes lié au non appel de OnActivityResult sont légions et j'ai déjà parcouru un bon paquet de réponse lié à ce problème, et pourtant, je n'ai toujours pas résolu le mien

    Pas du tout spécialisé dans le développement Android, je m’intéresse et je teste.
    Ainsi, j'ai fait une application avec une Navigation Drawer Activity. Sous Android Studio avec le menu contextuel New -> Activity -> Navigation Drawer Activity
    Mon Navigation Activity a 3 items dans son menu et donc 3 fragments qui s'y insère.

    Dans ma navigation activity lorsqu'un fragment est chargé, il y a egalement une Action Bar, et lorsque je clique sur l'action ajouté, je démarre une seconde activité qui doit me retourner une réponse


    Extract de NavigationActivity
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
         
            if (id == R.id.other_activity) {
                startActivityForResult(new Intent(this, OtherActivity.class), RESULT_OK );
                overridePendingTransition(R.anim.slide_in_from_left, R.anim.slide_out_to_left);
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }

    Dans ma seconde activité, j'effectue mes actions et je souhaite retourner un objet (class JAVA). En fait retourner l'objet sélectionné dans une liste.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    public class OtherActivity extends Activity {
    
        private RadListView _listView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.other_activity);
    
            MyDatabaseHandler db = new MyDatabaseHandler(this);
            if ( db.getMyObjCount()> 0 ) {
    
                _listView = (RadListView) findViewById(R.id.listView);
                final MyAdapter myViewAdapter = new MyAdapter(db.getAllMyObjs());
                _listView.setAdapter(myViewAdapter);
    
                _listView.addItemClickListener( new RadListView.ItemClickListener() {
                    @Override
                    public void onItemClick(int itemPosition, MotionEvent motionEvent) {
                        MyObj obj = (MyObj)myViewAdapter.getItem( itemPosition );
                       
                        Intent intent = new Intent();
                        intent.putExtra("selected_item",obj);
                        setResult(RESULT_OK, intent);
                        finish();
                    }
    
                    @Override
                    public void onItemLongClick(int itemPosition, MotionEvent motionEvent) {
    
                    }
                });
    
            }
            else
            {
                startActivity( new Intent( this, ThirdActivity.class));
            }
        }
    
        @Override
        public void onBackPressed() {  // Juste pour test, n'appelle pas plus le onActivityResult
            Intent data = new Intent();
            data.putExtra("key", new MyObj( "toto", 5, 12, "titi") );
            setResult(RESULT_OK, data);
            finish();
            super.onBackPressed();
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
    
           if ( id == R.id.home ) { // Never called, how how is identified the up button of action bar ?!?
                Intent data = new Intent();
                data.putExtra("key", new MyObj( "toto", 5, 12, "titi") );
                setResult(RESULT_OK, data);
                finish();
            }
    
            return super.onOptionsItemSelected(item);
        }
    }


    Ce cas semble très simple, on passe de l'activité Navigation a une seconde activité et on revient avec un résultat. Malheureusement, onActivityResult n'est jamais appelé dans l'activité navigation (pas d’arrêt sur le breakpoint) et je ne comprend pas pourquoi !!?? Dans ce schéma, cela ne semble rien a voir avec les fragments, mais juste une discussion d'activité à activité.

    Comme je suis dans les choux, merci pour votre aide.

  2. #2
    Expert confirmé
    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
    Points : 4 166
    Points
    4 166
    Par défaut
    C'est plutôt onActivityResult() dans NavigationActivity que tu aurais dû nous montrer.

    PS : la classe MyObj implèmente bien Parcelable ?
    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 à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    OnActivityResult contient simplement un Toaster et un breakpoint sur cette ligne.
    Le toaster n'est jamais appelé, mais si ca aide a repondre au problème:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     
           Toast.makeText(this, "onactivityresult called", Toast.LENGTH_SHORT).show(); // Avec un point d’arrêt sur cette ligne
     
     
            super.onActivityResult(requestCode, resultCode, data);
        }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Hephaistos007 Voir le message

    PS : la classe MyObj implèmente bien Parcelable ?
    Absolument,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class MyObj implements Parcelable {
     [...]
    }

  5. #5
    Expert confirmé
    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
    Points : 4 166
    Points
    4 166
    Par défaut
    Bizarre. Et il y a quoi dans ton manifeste à tout hasard ?
    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

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    OtherActivity est ManagePetsActivity

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.iotware.pets" >
    
        <uses-sdk android:minSdkVersion="19" />
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
        <!--
     The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
             Google Maps Android API v2, but are recommended.
        -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".NavigationActivity"
                android:label="@string/title_activity_navigation" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
           
           <meta-data
                android:name="com.google.android.gms.version"
                android:value="@integer/google_play_services_version" />
            <meta-data
                android:name="com.google.android.maps.v2.API_KEY"
                android:value="@string/google_maps_key" />
    
            <activity
                android:name=".SettingsActivity"
                android:label="@string/title_activity_settings"
                android:parentActivityName=".NavigationActivity" >
                <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value="com.iotware.pets.NavigationActivity" />
            </activity>
            <activity
                android:name=".AddPetActivity"
                android:label="@string/title_activity_add_dog"
                android:parentActivityName=".ManagePetsActivity" >
                <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value="com.iotware.pets.ManagePetsActivity" />
            </activity>
            <activity
                android:name=".ManagePetsActivity"
                android:label="@string/title_activity_manage_pets"
                android:parentActivityName=".NavigationActivity" >
                <meta-data
                    android:name="android.support.PARENT_ACTIVITY"
                    android:value="com.iotware.pets.NavigationActivity" />
            </activity>
            <activity
                android:name=".StatActivity"
                android:label="@string/title_activity_stat" >
            </activity>
        </application>
    
    </manifest>

  7. #7
    Expert confirmé
    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
    Points : 4 166
    Points
    4 166
    Par défaut
    Je pense à un autre truc : quelle est la valeur de RESULT_OK ? elle doit être impérativement positive
    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

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Il s'agit d'une constante Android definie dans Activity.java

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /** Standard activity result: operation succeeded. */
        public static final int RESULT_OK           = -1;

    Mais elle n'est pas positive, j'essaye avec une valeur positive !

    **Edit1**
    J'ai essayé avec la valeur 1 au lieu de RESULT_OK, mais ca ne change rien

    **Edit2**
    J'ai bien modifié la valeur de retour dans OtherActivity, mais je n'avais pas modifié la valeur de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    startActivityForResult(new Intent(this, OtherActivity.class), RESULT_OK );
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    startActivityForResult(new Intent(this, OtherActivity.class), 1 );
    Et la miracle de chez miracle, ça fonctionne !!!!

    Merci beaucoup !!


    Mais ce qui m’épate c'est cette constante, qui semble tout a fait valide et que j'ai vu dans de nombreux exemples !??
    Par ailleurs, comment on devine que cette valeur doit être strictement positive ?

    En tout cas merci a l'essai français qui m'a donné la réponse, juste avant 2 essais Canadien coup sur coup XD

  9. #9
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Y a confondage...

    A appelle B

    A utilise startActivityForResult et passe un code (interne à A connu de lui seul pour identifier cet appel) qui doit être >0.
    B fait un setResult(RESULT_OK) pour dire que tout est bon les données sont dans le resultat (ou rien du tout comme un simple "finish()" pour renvoyer un RESULT_CANCEL)
    A recoit l'appel onActivityResult avec *DEUX* codes:
    * Le code interne utilisé par startActvitiyForResult
    * Le code de retour (RESULT_OK ou RESULT_CANCEL) de B.

    Du coup onActivityResult de A doit ressembler à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode = MON_CODE_ULTRA_SECRET) {
            // c'est bien moi qui ait fait le startActivityForResult, je vais donc gérer le truc...
            if (resultCode == RESULT_OK) {
                // ok , j'ai bien les données voulues dans "data"
            } else {
                // l'utilisateur a du faire "back" sans valider par exemple
            }
        } else
            super.onActivityResult(requestCode,resultCode,data); // sinon, ben je laisse le truc par défaut s'en charger.
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    J'ai testé et compris ces explications, c'est devenu limpide !!

    Merci beaucoup pour ton aide et ces explications.

  11. #11
    Expert confirmé
    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
    Points : 4 166
    Points
    4 166
    Par défaut
    Citation Envoyé par Ahryman40k Voir le message
    Mais ce qui m’épate c'est cette constante, qui semble tout a fait valide et que j'ai vu dans de nombreux exemples !??
    Par ailleurs, comment on devine que cette valeur doit être strictement positive ?
    En fait, je parlais du RequestCode, et pas du resultCode. Bref, tu as compris. Et la nécessité d'avoir une valeur positive est mentionnée dans la doc officielle : http://developer.android.com/referen...t.Intent, int)
    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

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/12/2010, 02h13
  2. Réponses: 0
    Dernier message: 23/12/2010, 06h13
  3. Réponses: 4
    Dernier message: 05/03/2010, 10h13
  4. Pb retour methode call.invoke
    Par tigerpob79 dans le forum Services Web
    Réponses: 2
    Dernier message: 06/11/2008, 18h21
  5. Réponses: 1
    Dernier message: 15/05/2007, 11h19

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