web-dev-qa-db-fra.com

Android les préférences partagées ne sont pas enregistrées

J'ai créé un Android fond d'écran en direct et j'essaie de laisser un utilisateur choisir une image sur son téléphone et l'appliquer comme image d'arrière-plan, mais quand je lance l'activité qui démarre l'intention pour choisir les images, mes préférences partagées ne semblent pas enregistrer correctement.

Ci-dessous est ma méthode onCreate de l'activité que je démarre lorsque les utilisateurs appuient sur le bouton de préférence, et le onActivityResult qui obtient le chemin de l'image sur l'appareil (tout ce qui semble fonctionner). Le println après avoir validé les préférences n'imprime rien.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
    photoPickerIntent.setType("image/*");
    startActivityForResult(photoPickerIntent, SELECT_PICTURE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);

            preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
            preferences.edit().putString(SETTINGS_BACKGROUND_IMAGE, "okok");
            preferences.edit().commit();

            System.out.println("Image" + preferences.getString(SETTINGS_BACKGROUND_IMAGE, ""));
        }
    }

    finish();
}
37
jOE

De la documentation :

Créez un nouvel éditeur pour ces préférences, grâce auquel vous pouvez apporter des modifications aux données dans les préférences et valider atomiquement ces modifications dans l'objet SharedPreferences.

Comme il s'agit d'une nouvelle instance de l'éditeur, votre code devrait ressembler davantage à ceci:

preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok");
editor.apply();
82
zrgiu

Essayez une autre façon d'initialiser votre variable SharedPreferences:

SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this);

Vous pouvez également chaîner l'écriture vers sf avec sf.edit().putString(string, value).commit();

16
josephus

Gardez à l'esprit que vous avez besoin de la même activité pour enregistrer et récupérer des données. Vous ne pouvez pas utiliser une méthode comme

public String readValue(Activity activity, String key) {
    SharedPreferences sp = activity.getPreferences(Context.Mode_PRIVATE);
   //...
}

Pour recevoir les mêmes données de la même activité, vous devez appeler cette méthode avec la même activité que celle que vous aviez enregistrée.

0
Guchelkaben

eh bien, basé sur @zrgiu post, pour moi, je n'ai travaillé qu'en ajoutant editor.clear(); avant d'utiliser l'éditeur ... donc le code final sera quelque chose comme:

preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
SharedPreferences.Editor editor = preferences.edit();
editor.clear();
editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok");
editor.commit();

;)

0
lienmt

Dans mon cas, j'ai dû ajouter editor.apply (); avant de s'engager pour travailler.

Voici mon code:

preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok");
editor.apply();//I added this line and started to work...
editor.commit();
0
Juan Pablo