2012-03-13 3 views
33

Я создал Android-обои для Android, и я пытаюсь разрешить пользователю выбирать изображение со своего телефона и применять его как фоновое изображение, но когда я запускаю деятельность, которая начинается с намерения выберите изображения, мои общие настройки, похоже, не сохранены должным образом.Общие настройки для Android не сохраняются

Ниже мой метод onCreate активности, который я запускаю, когда пользователи нажимают кнопку предпочтения, и onActivityResult, который получает путь к изображению на устройстве (все это работает). Печать после того, как я зафиксирую настройки, ничего не выводит.

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

ответ

76

От documentation:

Создать новый редактор для этих предпочтений, с помощью которых вы можете сделать модификаций данных в настройках и атомарно совершившие этих изменений обратно возражает SharedPreferences.

Поскольку это новый экземпляр редактора, ваш код должен быть больше, как это:

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

Является единственным, кто не видит различия в логике между этим и исходным кодом? – josephus

+35

, когда вы вызываете preferences.edit(), вы получаете экземпляр редактора, на котором jOE помещал строку, но после этого этот экземпляр больше не использовался (таким образом, потерянный и, возможно, сбор мусора). Затем jOE снова вызвал функцию preferences.edit(), получив другой экземпляр редактора, содержащий начальные настройки, которые он только что сохранил. Это в основном просто сохранили первоначальные настройки (ничего не изменило для его общих настроек) – zrgiu

+1

zrgui, большое спасибо за вашу помощь! Ваше предложение отлично работало! – jOE

13

Попробуйте другой способ инициализации ваших SharedPreferences переменной:

SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this); 

Вы также можете цепную письменной форме sf с sf.edit().putString(string, value).commit();

+1

Я больше не хочу его связывать. –

+4

Я не игрок. Я просто много цепляюсь ... –

1

В моем случае мне пришлось добавить editor.apply(); перед фиксацией для работы.

Это мой код:

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 - сохранить данные a-synchronically, а commit - сохранить его немедленно, вы НЕ должны использовать их обоих !!! – XcodeNOOB

0

хорошо, основанный на @zrgiu пост, для меня работал только добавление editor.clear(); перед использованием редактора ... поэтому окончательный код будет что-то вроде:

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

;)