web-dev-qa-db-ja.com

Android共有設定が保存されない

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

以下は、ユーザーが設定ボタンを押したときに開始するアクティビティのonCreateメソッドと、デバイス上の画像のパスを取得するonActivityResultです(動作しているようです)。プリファレンスをコミットした後のprintlnは何も出力しません。

@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

ドキュメント から:

これらの設定用の新しいエディターを作成します。このエディターを使用して、設定内のデータに変更を加え、それらの変更をSharedPreferencesオブジェクトにアトミックにコミットできます。

これは新しいエディターインスタンスなので、コードは次のようになります。

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

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

_SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this);
_

sf.edit().putString(string, value).commit();でsfへの書き込みをチェーンすることもできます

16
josephus

データの保存と取得には同じアクティビティが必要であることに注意してください。次のような方法は使用できません

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

同じアクティビティから同じデータを受信するには、データを保存したアクティビティとまったく同じアクティビティでこのメソッドを呼び出す必要があります。

0
Guchelkaben

よく、@ zrgiuの投稿に基づいて、エディターを使用する前にeditor.clear();を追加するだけでしたので...最終的なコードは次のようになります:

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

;)

0
lienmt

私の場合、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();
0
Juan Pablo