2012-03-13 12 views
33

Androidのライブ壁紙を作成しました。ユーザーが携帯電話から画像を選択して背景画像として適用しようとしていますが、目的を開始するアクティビティを開始すると画像を選ぶと、私の共有設定が適切に保存されていないようです。Androidの共有設定が保存されない

以下は、ユーザが設定ボタンを押したときに開始するアクティビティのonCreateメソッドと、デバイス上の画像のパスを取得するonActivityResult(すべて動作するように思われる)です。環境設定をコミットした後のprintlnは何も印刷しません。 documentationから

@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

あなたが好みのデータに 変更を加えると、アトミックバック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が文字列を入れていたEditorインスタンスが取得されますが、その後、そのインスタンスは使用されなくなりました(したがって、失われ、おそらくガベージコレクションされました)。その後、jOEはpreferences.edit()を再度呼び出し、初期設定を含む別のEditorインスタンスを取得しました。これは基本的に最初の設定を保存しただけです(共有設定を更新することはありません) – zrgiu

+1

zrgui、ありがとうございました!あなたの提案は完璧に機能しました! – jOE

13

変数あなたのSharedPreferencesを初期化する別の方法を試してください:

SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this); 

あなたはまたに書き込みを連鎖さすることができますsf with sf.edit().putString(string, value).commit();

+1

もうチェーンしたくないです。 –

+4

私はちょうどチェーンをたくさん持っているプレイヤーではありません... –

1

私の場合、editor.apply()を追加する必要がありました。働くためにコミットする前に。

これは私のコードです:

@zrgiuポストに基づいても
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

適用は、コミットが即座にそれを保存する間にデータを同期的に保存することです。 – XcodeNOOB

0

、私のためにのみ使用する前にエディタをeditor.clear();を追加する働いた...ので、最終的なコードのようなものになります。

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

関連する問題