2012-03-13 30 views
33

He creado un fondo de pantalla de Android en vivo y estoy tratando de dejar que un usuario elija una imagen de su teléfono y aplicarla como imagen de fondo, pero cuando la inicio, intento iniciar elegir las imágenes, mis preferencias compartidas no parecen guardarse correctamente.Preferencias compartidas de Android que no guardan

A continuación se muestra mi método onCreate de la actividad que comienzo cuando los usuarios presionan el botón de preferencia, y onActivityResult que obtiene la ruta de la imagen en el dispositivo (todo parece funcionar). La impresión después de confirmar las preferencias no imprime nada.

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

Respuesta

76

Desde el documentation:

Crear un nuevo editor para estas preferencias, a través del cual se puede hacer modificaciones a los datos en las preferencias y atómicamente cometer esos cambios de nuevo a los SharedPreferences objeto.

ya que es una nueva instancia Editor, el código debe ser de la misma familia:

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

¿Soy el único que no puede ver la diferencia en la lógica entre esto y el código original? – josephus

+35

cuando llamas a preferences.edit(), obtienes una instancia de Editor, en la que jOE estaba poniendo una cadena, pero después de eso, esa instancia ya no se usaba más (perdiendo así, y posiblemente recogiendo basura). Luego, jOE llamó a preferences.edit() nuevamente, obteniendo otra instancia de Editor que contiene la configuración inicial, que acaba de guardar en su lugar. Esto básicamente acaba de guardar la configuración inicial (no hizo nada para actualizar sus preferencias compartidas) – zrgiu

+1

zrgui, muchas gracias por su ayuda! ¡Tu sugerencia funcionó perfectamente! – jOE

13

Pruebe otra forma de inicializar sus SharedPreferences variables:

SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this); 

También puede encadenar escrito a sf con sf.edit().putString(string, value).commit();

+1

No quiero encadenarlo más. –

+4

No soy un jugador que acabo de encadenar mucho ... –

1

En mi caso tuve que agregar editor.apply(); antes de comprometerse para trabajar.

Este es mi código:

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

aplicar es guardar los datos de forma sincrónica, mientras que el compromiso es guardarlo de inmediato, NO debes usarlos ambos !!! – XcodeNOOB

0

así, con base en el poste @zrgiu, para mí sólo trabajó añadiendo editor.clear(); antes de usar el Editor ... por lo que el código final será algo como:

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

;)

Cuestiones relacionadas