2012-03-13 26 views
33

Ho creato uno sfondo animato Android e sto cercando di consentire a un utente di scegliere un'immagine dal proprio telefono e applicarla come immagine di sfondo, ma quando avvio l'attività che avvia l'intento scegli le immagini, le mie preferenze condivise non sembrano essere salvate correttamente.Preferenze condivise Android non salvando

Di seguito è riportato il mio metodo onCreate dell'attività che avvio quando gli utenti premono il pulsante di preferenza e onActivityResult che ottiene il percorso dell'immagine sul dispositivo (tutto ciò che sembra funzionare). La stampa dopo aver commesso le preferenze non stampa nulla.

@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(); 
} 

risposta

76

Dal documentation:

Creare un nuovo editor per queste preferenze, attraverso il quale è possibile effettuare modifiche ai dati nelle preferenze e atomicamente commit quelle modifiche indietro ai SharedPreferences oggetto.

Dal momento che è una nuova istanza Editor, il codice dovrebbe essere più simile a questo:

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

Sono l'unico che non può vedere la differenza nella logica tra questo e il codice originale? – josephus

+35

quando si chiama preferences.edit(), si ottiene un'istanza di Editor, su cui jOE stava mettendo una stringa, ma successivamente quell'istanza non è stata più utilizzata (quindi persa, e probabilmente raccolta di dati inutili). Quindi, jOE ha chiamato di nuovo preferences.edit(), ottenendo un'altra istanza di Editor contenente le impostazioni iniziali, che ha appena salvato sul posto. Questo in pratica ha appena salvato le impostazioni iniziali (non ha fatto nulla per aggiornare le sue preferenze condivise) – zrgiu

+1

zrgui, grazie mille per il tuo aiuto! Il tuo suggerimento ha funzionato perfettamente! – jOE

13

Prova un altro modo di inizializzare i tuoi SharedPreferences variabile:

SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this); 

È inoltre possibile concatenare scrivendo a sf con sf.edit().putString(string, value).commit();

+1

Non voglio più incatenarlo. –

+4

Non sono un giocatore Ho solo una catena molto ... –

1

Nel mio caso ho dovuto aggiungere editor.apply(); prima di impegnarsi per lavorare.

Questo è il mio codice:

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(); 
+2

apply è di salvare i dati a-sincronicamente mentre commit è di salvarli immediatamente, NON dovresti usarli entrambi !!! – XcodeNOOB

0

bene, sulla base di posta @zrgiu, per me solo lavorato aggiungendo editor.clear(); prima di utilizzare l'editor ... in modo che il codice finale sarà qualcosa del tipo:

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

;)

Problemi correlati