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 :

plusieurs paires/valeurs dans une SharedPrefernce


Sujet :

Android

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut plusieurs paires/valeurs dans une SharedPrefernce
    bonjour,
    est-il possible de retourner plusieurs paires/valeurs dans une SharedPrefernce en direction d'une activité "appelante" (MainActivity)?
    J'ai écrit le code suivant pour retourner l'adresse ip d'un serveur et un numéro de port à l'activité précédente lors de l'appui sur le bouton back du téléphone:
    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
     
     @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)
        {
            super.onKeyDown(keyCode, event);
     
            if (keyCode == KeyEvent.KEYCODE_BACK)
            {
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
                SharedPreferences.Editor editor = preferences.edit();
                String addr = edText_ip.getText().toString();
                editor.putString(ADDR_SERVEUR, addr);   //valeur affectée à la clé
                String port = edText_port.getText().toString();
                editor.putString(PORT, port);   //valeur affectée à la clé
                editor.commit();
                this.finish();
                return true;
            }
            //return super.onKeyDown(keyCode, event);
            return false;
        }
    Au niveau de la 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
     
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
     
            if(requestCode == 1)  //code retourné par setParameterActivity
            {
                //relire dans une SharedPreferences
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
                String value = preferences.getString(ADDR_SERVEUR, "0.0.0.0");
                String port = preferences.getString(PORT, "2000");
                Log.d("add_serveur", value);
                Log.d("port", port);
            }
            ....
    Dans add_serveur et port je n'ai que la valeur saisie dans le champ correspondant au port.
    La valeur dans add_serveur semble écrasée par celle dans port.
    Donc, est-il possible de stocker plusieurs valeurs dans une SharedPreference ? Ca me semblerait un minimum...
    Ou alors faut-il s'y prendre autrement?

    Merci

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur mobile iOS / Android
    Inscrit en
    Décembre 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur mobile iOS / Android
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 259
    Points : 690
    Points
    690
    Par défaut
    Bonjour,

    J'ai apporté quelques modifications à ta méthode ci-dessous.
    Quelques remarques :

    Utilise apply() au lieu de commit() pour applique les modifications ou enregistrement de données dans les préférences.

    A chaque novelle entrée, fait appel à apply().

    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
     @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event)
    {
       super.onKeyDown(keyCode, event);
     
       if (keyCode == KeyEvent.KEYCODE_BACK)
       {
          SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
          String addr = edText_ip.getText().toString();
          preferences.edit().putString(ADDR_SERVEUR, addr).apply();   //valeur affectée à la clé 
          String port = edText_port.getText().toString();
          preferences.edit().putString(PORT, port).apply();   //valeur affectée à la clé
          this.finish();
          return true;
       }
       //return super.onKeyDown(keyCode, event);
       return false;
    }
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell

    N'oubliez pas de consulter les FAQ Swift, Android
    Tutoriel : Développer une application multilingue sous iOS

  3. #3
    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
    Si tu presses le bouton BACK, ta méthode onActivityResult() n'est probablement jamais appelée car ce n'est pas ainsi que ce mécanisme fonctionne. D'ailleurs, on voit qu'il manque le minimum syndical :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Intent data = new Intent();
        setResult(RESULT_OK, data);
    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

  4. #4
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Bonjour et merci pour vos réponses.
    J'ai appliqué les propositions de Seelass mais ça ne change rien.
    Hephaistos007, la méthode onActivityResult() est bien appelée car les deux appels Log.d affichent bien un résultat mais avec la valeur 23 pour les deux si c'est que j'ai rentré pour le n° de port.

    Dans les docs Google, les exemples ne présentent le stockage que d'une seule valeur.
    Je continue à chercher....

  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
    Une erreur au niveau des constantes ADDR_SERVEUR et PORT ? montres-les nous dans tes 2 classes.
    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 habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Voila ce qu'il en est de ma classe 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
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    public class MainActivity extends AppCompatActivity {
     
        public final static String DATE = null;
        public static final String ADDR_SERVEUR = null; //initialisation à null fondamentale pour que ça marche
        public final static String PORT = null;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            String couleur = preferences.getString(FAVORITE_COLOR, "FFFFFF");
            Log.d("Fav color", couleur);
     
            //récupérer une référence vers le bouton parametre
            final Button vButton1 = (Button)findViewById(R.id.button_parametre);
            vButton1.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    //démarrer l'activité de saisie des paramètres réseau
                    Intent intentParametre = new Intent(getApplicationContext(), setParameterActivity.class);
                    intentParametre.putExtra(DATE, 58); //la clé est DATE, la valeur associée est 58
                    startActivityForResult(intentParametre, 1);
                }
            });
     
            //récupérer une référence vers le bouton au_doigt
            final Button vButton2 = (Button)findViewById(R.id.button_auDoigt);
            vButton2.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    //démarrer l'activité slider
                    Intent intentParametre = new Intent(getApplicationContext(), SliderCmde.class);
                    intentParametre.putExtra(DATE, 98); //la clé est DATE, la valeur associée est 58
                    startActivityForResult(intentParametre, 2);
                }
            });
     
            //récupérer une référence vers le bouton accéléromètre
            final Button vButton3 = (Button)findViewById(R.id.button_accelerometre);
            vButton3.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    //démarrer l'activité accéléromètre
                    Intent intentParametre = new Intent(getApplicationContext(), AccelerometreActivity.class);
                    intentParametre.putExtra(DATE, 108); //la clé est DATE, la valeur associée est 58
                    startActivityForResult(intentParametre, 3);
                }
            });
        }   //onCreate end
     
        /**************************************************************************
        /* Call Back method  to get the Message form other Activity
         * Méthode appelée au retour des différentes activités qui renvoientdans
         * requestCode la valeur passée à l'appel
         *************************************************************************/
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
     
            //check if the request code is same as what is passed in MainActivity here it is 1
            if(requestCode == 1)  //code retourné par setParameterActivity
            {
                //relire dans une SharedPreferences
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
                String value = preferences.getString(ADDR_SERVEUR, "0.0.0.0");
                String port = preferences.getString(PORT, "2000");
                Log.d("add_serveur", value);
                Log.d("port", port);
            }
     
            if(requestCode == 2)  //code retourné par SliderCmde
            {
            }
     
            if(requestCode == 3)  //code retourné par l'activité Accéléromètre
            {
            }
        }
    }
    Le code de l'activité dans laquelle je rentre une adresse IP et un n° de port
    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
     
    public class setParameterActivity extends AppCompatActivity {
     
        private Button mButton = null;
        private EditText edText_ip = null;
        private EditText edText_port = null;
     
        public static final String ADDR_SERVEUR = null; //initialisation à null fondamentale pour que ça marche
        public static final String PORT = null;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_set_parameter);
     
            edText_ip = (EditText)findViewById(R.id.editText_ip);
            edText_port = (EditText)findViewById(R.id.editText_port);
        }
     
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)
        {
            super.onKeyDown(keyCode, event);
     
            if (keyCode == KeyEvent.KEYCODE_BACK)
            {
                //sauvegarde dans une SharedPreferences
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
                SharedPreferences.Editor editor = preferences.edit();
                String addr = edText_ip.getText().toString();
                editor.putString(ADDR_SERVEUR, addr).apply();   //adresse IP affectée à la clé
                String port = edText_port.getText().toString();
                editor.putString(PORT, port).apply();   //n° de port affecté à la clé
                //editor.commit();
                this.finish();
                return true;
            }
            return false;
        }
     
        @Override
        protected void onStart()
        {
            super.onStart();
            Log.d("onStart", "onStart");
        }
    }
    Dans les deux constantes, je retrouve ce qui a été lu par edText_port.getText().toString();

    Merci pour vos réponses.

  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
    J'avais raison. Le problème vient de l'usage incorrect de ces constantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     public static final String ADDR_SERVEUR = null; //initialisation à null fondamentale pour que ça marche
     public static final String PORT = null;
    Ces constantes doivent te servir de clés uniques pour stocker/récupérer des valeurs dans la SharedPreference. Elle ne doivent pas être nulles mais bien être des clés textuelles de ton choix:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     public static final String ADDR_SERVEUR = "__serv__";
     public static final String PORT = "__port__";
    Par ailleurs, inutile de les répéter dans 2 classes. Une seule fois suffira (disons dans MainActivity) car tu pourras y accéder d'où tu veux en écrivant MainActivity.ADDR_SERVEUR
    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 habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Merci, ça fonctionne.
    y a-t-il une explication sur le fait que l'initialisation à null nuit au bon fonctionnement?

  9. #9
    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
    Parce qu'une clé (dans une SharedPreference ou tout autre structure de ce type) doit être une chaîne non-vide.
    Et aussi qu'une constante ne doit pas être null de manière générale (quel intérêt ?), sachant qu'on ne peut plus modifier sa valeur dans la suite du programme... (dans le cas d'une variable c'est différent)
    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

  10. #10
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Ok, merci bien.

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

Discussions similaires

  1. Plusieurs valeurs dans une même cellule
    Par biche1 dans le forum Excel
    Réponses: 4
    Dernier message: 25/09/2008, 15h56
  2. Réponses: 5
    Dernier message: 04/06/2008, 10h03
  3. recuperer plusieurs valeurs dans une cellule
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/03/2008, 21h40
  4. plusieurs valeurs dans une seul select
    Par sonja dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/06/2007, 16h30
  5. Réponses: 10
    Dernier message: 03/07/2006, 14h55

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